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

时间:2015-10-02 05:43:27

标签: javascript mongodb meteor

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

{
    "_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 });
            }
        }]
    }
 });

1 个答案:

答案 0 :(得分:2)

根据您的要求,以下是一些可能的解决方案:

如果文章中的反应性很重要,但结构中没有反应

换句话说,如果标题发生变化,您希望客户立即看到,但如果添加了4级孩子,如果客户在没有重新订阅的情况下没有看到更改,则表示没问题。< / p>

在这种情况下,您可以遍历树一次并发布所有相关的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}});
});

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

例如,如果您知道最多只能获得三个级别,那么您可以使用库来计算reactive join。看看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"
        }
      ]
    }
  ]
};

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