【问题标题】:mongoDB: Find missing documents in model tree structure with parent referencemongoDB:在具有父引用的模型树结构中查找丢失的文档
【发布时间】:2016-01-28 21:16:13
【问题描述】:

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

但这并不好用,因为我需要使用循环向上直到顶部文档(= 类型存在)。

【问题讨论】:

    标签: javascript mongodb meteor


    【解决方案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);
    }
    });
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2013-02-20
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      相关资源
      最近更新 更多