【问题标题】:Create a JSON tree in Node.Js from MongoDB从 MongoDB 在 Node.Js 中创建 JSON 树
【发布时间】:2013-09-28 08:51:16
【问题描述】:

我尝试了几天从我的 MongoDB 创建一个 JSON 树。我使用child reference model structure,其中“Books”是根节点。
我正在尝试实现这种形式的 JSON 树:

[{
    title: "Books",
    children: [{
        title: "Programming",
        children: [{
            title: "Databases",
            children: [{
                title: "MongoDb"
            }, {
                title: "Postgres"
            }]
        }, {
            title: "Languages"
        }]
    }, {
        title: "Item 2"
    }, {
        title: "Item 3"
    }, {
        title: "Item 4"
    }]
}]

但我真的很难让它发挥作用。第一级(书籍,第 2/3/4 项)只能有 5 个项目,但其他子菜单可以有无穷大。

如何实现对 Mongo 的调用将赋予此树结构的数据数组的转换? 提前致谢

【问题讨论】:

  • 你在纠结什么? JavaScript 代码? MongoDB结构?您引用了未添加到问题中的数据结构和代码。
  • 另外,您引用的树结构不应该是嵌套的。它只是列出特定树节点的子节点。

标签: javascript json node.js mongodb tree


【解决方案1】:

假设您必须关注数据(已从数据库加载):

var data = [
  { _id: "MongoDB", children: [] },
  { _id: "Postgres", children: [] },
  { _id: "Databases", children: [ "MongoDB", "Postgres" ] },
  { _id: "Languages", children: [] },
  { _id: "Programming", children: [ "Databases", "Languages" ] },
  { _id: "Books", children: [ "Programming" ] }
];

由于_id 是唯一的,因此在第一步中将其转换为字典,其中键是 id:

var dct = {};
for (var i = 0; i < data.length; i++) {
    var doc = data[i];
    dct[doc._id] = doc;
}

现在您再循环一次data 数组并设置子代:

for (var i = 0; i < data.length; i++) {
    var doc = data[i];
    var children = doc.children;
    var ref_children = [];
    for (var j = 0; j < children.length; j++) {
        var child = dct[children[j]]; // <-- here's where you need the dictionary
        ref_children.push(child);
    }
    doc.children = ref_children;
}

瞧,你完成了:

JSON.stringify(data);

编辑

如果你只想要根(不是任何其他节点的子节点的节点),那么首先你必须找到它们:

var get_parent = function(node, docs) {
    for (var i = 0; i < docs.length; i++) {
        var doc = docs[i];
        if (doc.children.indexOf(node) != -1) {
            return doc;
        }
    }
    return null;
};

var roots = [];
for (var i = 0; i < docs.length; i++) {
    var doc = data[i];
    if (get_parent(doc, docs) === null) {
        roots.push(doc);
    }
}
JSON.stringify(roots);

更有效的方法是在取消引用子项时存储父项(与编辑上面的代码比较):

for (var i = 0; i < data.length; i++) {
    var doc = data[i];
    var children = doc.children;
    var ref_children = [];
    for (var j = 0; j < children.length; j++) {
        var child = dct[children[j]]; // <-- here's where you need the dictionary
        child.has_parent = true; // <-- has a parent
        ref_children.push(child);
    }
    doc.children = ref_children;
}

var roots = [];
for (var i = 0; i < data.length; i++) {
    var doc = data[i];
    if (!doc.has_parent) {
        roots.push(doc);
    }
}
JSON.stringify(roots);

【讨论】:

  • 非常感谢,这最后的代码正是我所需要的。除了我需要转换字段名称“标题”中的_id,但非常感谢!经过数小时的绝望,你救了我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 2015-09-20
  • 2014-11-17
相关资源
最近更新 更多