mongoDB:使用父引用在模型树结构中查找缺少的文档

时间:2016-01-28 21:16:14

标签: javascript mongodb meteor

我有一些文档以模型树结构组织(深度是可变的!)。不幸的是,有些文件丢失了,我需要找到那些破链。如您所见,该链中的最后一个文档始终是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);

但是这并不好用,因为我需要使用一个循环来上升直到顶级文档(=类型存在)。

1 个答案:

答案 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);
}
});

或类似的东西......(没有数据很难调试)