这是由父字段分配在一起的文档示例:
{
"_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 });
}
}]
}
});
答案 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"
}
]
}
]
};
通过发布整个文档,您始终可以保证结构得以维护。当然,这在您的特定用例中可能并不实用。