如何在Obsidian中使用Dataview生成MOC的层级列表?
用Obsidian Dataview生成层级MOC列表解决方案
我在Obsidian中有一个由相互链接的层级MOC(内容地图)组成的笔记库,结构示例如下:
Home MOC_Data MOC_AI <AI、机器学习与深度学习相关笔记> MOC_BigQuery <BigQuery配置与代码相关笔记> MOC_Databases ... MOC_Software MOC_Google Analytics MOC_Google Tag Manager ...
我希望用Dataview生成仅包含MOC的层级列表,格式如下:
- MOC_Data
- MOC_AI
- MOC_BigQuery
- MOC_Databases
- MOC_Software
- MOC_Google Analytics
- MOC_Google Tag Manager
目前我能通过以下代码列出所有MOC,但无法呈现层级视图:
LIST WHERE contains(file.name, "MOC_")
方法一:基于链接关系的Dataview原生语法实现(适合两级层级)
如果你的MOC层级只有两级(顶级MOC → 子MOC),可以用Dataview原生语法直接生成:
LIST WITHOUT ID "- " + link(file.name) + "\n " + join( filter(file.outlinks, (l) => contains(l.file.name, "MOC_")), "\n - " ) WHERE contains(file.name, "MOC_") AND length(filter(file.inlinks, (l) => contains(l.file.name, "MOC_"))) = 0
代码说明:
WHERE contains(file.name, "MOC_"):筛选所有名称带MOC_的笔记AND length(filter(file.inlinks, (l) => contains(l.file.name, "MOC_"))) = 0:只保留没有被其他MOC链接的顶级MOCfilter(file.outlinks, ...):从当前MOC的外链中筛选出子级MOCjoin将子MOC拼接成带缩进的列表项,最终组合成层级结构
方法二:用DataviewJS实现多级层级渲染
如果你的MOC层级超过两级,或者需要更灵活的递归展示,推荐用DataviewJS:
// 筛选所有MOC文件 const mocs = dv.pages('"."').where(p => p.file.name.includes("MOC_")); // 构建MOC层级映射:父MOC名称 → 子MOC数组 const mocHierarchy = {}; const topLevelMocs = []; // 遍历每个MOC,梳理层级关系 mocs.forEach(moc => { // 找到当前MOC的父级MOC(即链接到当前MOC的MOC) const parentMocs = moc.file.inlinks.filter(link => mocs.some(m => m.file.path === link.path)); if (parentMocs.length === 0) { // 没有父MOC,归为顶级MOC topLevelMocs.push(moc); } else { // 将当前MOC添加到对应父MOC的子列表中 parentMocs.forEach(parentLink => { const parentName = parentLink.file.name; if (!mocHierarchy[parentName]) { mocHierarchy[parentName] = []; } mocHierarchy[parentName].push(moc); }); } }); // 递归生成层级列表文本 function renderMocList(mocs, indentLevel = 0) { const indent = " ".repeat(indentLevel); return mocs.map(moc => { const children = mocHierarchy[moc.file.name] || []; let line = `${indent}- ${dv.fileLink(moc.file.path)}`; if (children.length > 0) { line += "\n" + renderMocList(children, indentLevel + 1); } return line; }).join("\n"); } // 输出最终的层级列表 dv.paragraph(renderMocList(topLevelMocs));
代码说明:
- 先筛选出所有MOC文件,再遍历每个MOC,通过入链接找到它的父级MOC,构建层级映射
- 用递归函数
renderMocList生成带缩进的层级文本,支持任意多级MOC嵌套 - 最后通过
dv.paragraph将渲染好的列表输出到笔记中
内容的提问来源于stack exchange,提问作者DrPaulVella
相关产品推荐
相关产品推荐

