mongoDB:在具有父引用的模型树结构中查找缺失的文档

mongoDB: Find missing documents in model tree structure with parent reference

本文关键字:结构 查找 文档 模型树 mongoDB 引用      更新时间:2023-09-26

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

但这效果不佳,因为我需要使用循环向上,直到顶部文档(= 现有类型)。

如果你需要下树,你在这里谈论递归,所以你可能需要编写一个递归搜索函数

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

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