我有一些文档以模型树结构组织(深度是可变的!)。不幸的是,有些文件丢失了,我需要找到那些破链。如您所见,该链中的最后一个文档始终是target
字段。这是起点,我必须使用parent
向上看。该链中的最后一个元素始终是字段type
。
{
"_id" : "K7NSxNEnNSr9nCszR",
"title" : "title",
"type" : "book",
"ancestors" : [ ]
}
{
"_id" : "diyvwYz66yoTCTt9L",
"field" : "something",
"parent" : "K7NSxNEnNSr9nCszR",
"ancestors" : [
"K7NSxNEnNSr9nCszR"
]
}
{
"_id" : "diyvwYz66yoTCTt9L",
"field" : "anything",
"target" : "D2YuXtM6Gzt4eWaW2",
"parent" : "QWvdAyftSGANM3zy8",
"ancestors" : [
"K7NSxNEnNSr9nCszR",
"QWvdAyftSGANM3zy8"
]
}
我需要知道的是,是否有任何父项缺失或者是否缺少最后一个元素(=现有类型)。
var broken = [];
Collection.find({ target: { $exists: true }}).forEach(function(element) {
var startDocID = element._id;
if (Collection.find({ _id: element.parent }).count() === 0)
broken.push(startDocID);
});
console.log(broken);
但是这并不好用,因为我需要使用一个循环来上升直到顶级文档(=类型存在)。
答案 0 :(得分:1)
如果你需要沿着树走下去,你在这里谈论递归,所以你可能需要写一个递归搜索函数
var broken = [];
Collection.find({ target: { $exists: true }}).forEach(function(element) {
function recurse(e) {
var startDocID = e._id;
var nodes = Collection.find({ _id: e.parent });
if (node.count() === 0)
{broken.push(startDocID);}
else {
nodes.fetch().forEach(node) {
recurse(node)
}
}
recurse(element);
}
});
或类似的东西......(没有数据很难调试)