You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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链接的顶级MOC
  • filter(file.outlinks, ...):从当前MOC的外链中筛选出子级MOC
  • join将子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));

代码说明:

  1. 先筛选出所有MOC文件,再遍历每个MOC,通过入链接找到它的父级MOC,构建层级映射
  2. 用递归函数renderMocList生成带缩进的层级文本,支持任意多级MOC嵌套
  3. 最后通过dv.paragraph将渲染好的列表输出到笔记中

内容的提问来源于stack exchange,提问作者DrPaulVella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:25:21