获取与父字段一起分配的所有文档

Get all documents which are assigned together with parent field

本文关键字:文档 分配 一起 字段 获取      更新时间:2023-09-26

这是一个由父字段一起分配的文档的示例:

{
    "_id" : "dUgyVgoxVhYOU0wZC",
    "title" : "section-title",
    "type" : "section",
    "parent" : "I5ChGoVOeU2BKsgvZ"
}
{
    "_id" : "G3ecqJxydXJnFvRhN",
    "title" : "group-title",
    "type" : "group",
    "parent" : "dUgyVgoxVhYOU0wZC"
}
{
    "_id" : "djM5IU2wmOhpGoBX8",
    "title" : "elemtn-title",
    "type" : "element",
    "parent" : "G3ecqJxydXJnFvRhN"
}

现在我需要所有的文档,它们是一起分配的。我的尝试:

var id = "dUgyVgoxVhYOU0wZC";
Meteor.publish('article', function(id) { 
    return Articles.find({ 
        $or: [ 
            { _id: id }, 
            { parent: id } 
        ]  
    }); 
});

但这只是第二个层次。但我还需要第三层我没有直接访问权限(id或parent)

我试图用publishComposite这样做,但我的尝试不起作用:

Meteor.publishComposite('article', function(id){
    return {
        find: function(){
            return Articles.find({ 
                $or: [ 
                    { _id: id }, 
                    { parent: id } 
                ]  
            });
        },
        children: [{
            find: function(element){
                return Article.find({ parent: element._id });
            }
        }]
    }
 });

根据您的需求,这里有一些可能的解决方案:

如果冠词中的反应性很重要,而结构中的反应性不重要

换句话说,如果标题更改了,您希望客户端立即看到它,但如果添加了第4级子元素,如果客户端没有看到更改,则可以重新订阅。

在这种情况下,您可以遍历树一次并发布所有相关的id。下面是一个示例实现:

Meteor.publish('article', function(articleId) {
  var ids = [];
  // recursive search for child articles - populates
  // the ids array
  var search = function(id) {
    ids.push(id);
    var children = Articles.find({parent: id}).fetch();
    _.each(children, function(child) {
      search(child._id);
    });
  };
  // populate ids, starting with articleId
  search(articleId);
  return Articles.find({_id: {$in: ids}});
});

如果结构中的反应性很重要且最大深度很小

例如,如果你知道你最多只能得到三个层次,那么你可以使用库来计算响应连接。看一下publish-composite。

如果结构中的反应性很重要且深度未知

处理这种情况的唯一直接方法是重构文章数据。例如:

{
  _id: "dUgyVgoxVhYOU0wZC",
  title: "section-title",
  type: "section",
  children: [
    {
      _id: "G3ecqJxydXJnFvRhN",
      title: "group-title",
      type: "group",
      children: [
        {
          _id: "djM5IU2wmOhpGoBX8",
          title: "elemtn-title",
          type: "element"
        }
      ]
    }
  ]
};

通过发布整个文档,您可以始终保证结构得到维护。当然,这在您的特定用例中可能不实用。