获取与父字段一起分配的所有文档
Get all documents which are assigned together with parent field
这是一个由父字段一起分配的文档的示例:
{
"_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"
}
]
}
]
};
通过发布整个文档,您可以始终保证结构得到维护。当然,这在您的特定用例中可能不实用。
相关文章:
- 使用promise和mongoose对文档进行排序
- document.open/document.write没有正确地清除chrome中的文档——这是chrome的错误吗
- Ajax请求文档就绪会导致jquery加载缓慢
- MongoDB (php) - 以数组而不是多个属性的形式返回文档属性
- 谷歌文档表面引擎
- 来自文档或下一个静态父级的事件委派
- 如何将childNodes用于XML文档
- 文档就绪提供了错误的选择器高度
- 将当前用户的 ID 推送到 meteorjs 中集合/文档的内部数组
- 未捕获的语法错误:无法在“文档”上执行“查询选择器”
- BrowserId登录请求在文档加载时被调用
- 从Javascript和Php变量创建Html模板文档
- 如何通过谷歌应用程序脚本从谷歌文档中的位置确定命名范围
- 为什么可以't我将检索到的文档分配给控制台中的变量
- 如何在文档就绪 .fileupload 中分配值
- 自动将我上传的文档分配给内容类型
- 阻止删除在准备就绪的文档上分配的处理程序
- 为什么将其他对象分配给内置对象(例如文档、窗口)没有意义
- 获取与父字段一起分配的所有文档
- 动态分配给文档.getElementById从数组字符串