我已经搜索了一段时间,但没有找到任何好的答案.我有n-deep棵树,我存储在数据库中,我想填充all parents,所以最后我得到了完整的树

node
 -parent
  -parent
    .
    .
    -parent

到目前为止,我填充到2级,正如我提到的,我需要达到n级.

Node.find().populate('parent').exec(function (err, items) {
   if (!err) {
     Node.populate(items, {path: 'parent.parent'}, function (err, data) {
       return res.send(data);
     });
   } else {
     res.statusCode = code;
     return res.send(err.message);
   }
 });

推荐答案

只是不要:)

没有好办法做到这一点.即使你做了一些map reduce,如果你有或者需要的话,它也会有糟糕的性能和切分问题.

Mongo作为NoSQL数据库非常适合存储树文档.如果没有太多"查找特定叶"查询,可以存储整个树,然后使用map reduce从中获取一些特定叶.如果这不适合你,可以 Select 两个系列:

  1. 简化树 struct :{_id: "tree1", tree: {1: [2, {3: [4, {5: 6}, 7]}]}}.数字只是 node 的ID.这样,您将在一个查询中获得整个文档.然后提取所有ID并运行第二个查询.

  2. node :{_id: 1, data: "something"}{_id: 2, data: "something else"}.

然后,您可以编写简单的循环函数,将第一个集合中的 node ID替换为第二个集合中的数据.2查询和简单的客户端处理.

Small update:

您可以扩展第二个系列,使其更加灵活:

{_id: 2, data: "something", children:[3, 7], parents: [1, 12, 13]}

这样你就可以从任何一片叶子开始搜索.然后,使用map reduce到达树的这一部分的顶部或底部.

Mongodb相关问答推荐

在出现错误时忽略mongodb事务回滚是好做法吗

MongoDB对两个串联数组进行排序

在MongoDB中获取所有帖子时如何获取相关用户信息

MongoDB查询优化

如何 db.getUser() 使用 go mongo-driver

判断对象数组中的值是否存在golang

在我的查询中使用 populate() 时的 MongoDB createIndex()

在 MongoDB 中打开连接的 SocketTimeout

如何在 Mongo 聚合管道中获取限制之前的计数

更新 mongodb 文档中的特定字段

MongoDB:单个数据库处理程序的 >5 个打开连接

Node.js MongoDB Upsert 更新

从每个组中 Select 前 N 行

如何使用node.js http服务器从mongodb返回大量行?

使用自定义 _id 值时 mongodb 中的 Upserts

Mongodb $lookup 使用 _id 无效果

通过浏览器连接mongodb?

MongoTemplate upsert - 从 pojo 进行更新的简单方法(哪个用户已编辑)?

未找到 MongoDB 数据/数据库

用 MongoDB 中的属性表示多对多关系的最佳模型