MongoDB:使用具有祖先数组的模型树结构检查缺失的文档

时间:2017-01-02 08:55:11

标签: arrays mongodb

我正在使用带有祖先数组的模型树结构,我需要检查是否缺少任何文档。

dput(v1)
c("I am an angry tiger.", "I am unhappy clam.", "I am an angry and unhappy tiger.", 
"I am an angry, angry, tiger.", "Beep boop.")
dput(v2)
c("angry", "unhappy")

我的尝试是检查每个祖先id是否存在。如果失败,则此文档丢失,数据结构已损坏。

{
    "_id" : "GbxvxMdQ9rv8p6b8M",
    "type" : "article",
    "ancestors" : [ ]
}
{
    "_id" : "mtmTBW8nA4YoCevf4",
    "parent" : "GbxvxMdQ9rv8p6b8M",
    "ancestors" : [
        "GbxvxMdQ9rv8p6b8M"
    ]
}
{
    "_id" : "J5Dg4fB5Kmdbi8mwj",
    "parent" : "mtmTBW8nA4YoCevf4",
    "ancestors" : [
        "GbxvxMdQ9rv8p6b8M",
        "mtmTBW8nA4YoCevf4"
    ]
}
{
    "_id" : "tYmH8fQeTLpe4wxi7",
    "refType" : "reference",
    "parent" : "J5Dg4fB5Kmdbi8mwj",
    "ancestors" : [
        "GbxvxMdQ9rv8p6b8M",
        "mtmTBW8nA4YoCevf4",
        "J5Dg4fB5Kmdbi8mwj"
    ]
}

但是这样做会需要很多数据库调用。有可能优化这个吗? 也许我可以首先获得一个包含所有唯一祖先id的数组并检查这些文档是否存在于一个db调用中?

1 个答案:

答案 0 :(得分:0)

首先从你的收藏品中取出所有不同的祖先。

var allAncesstorIds = db.<collectionName>.distinct("ancestors");

然后检查集合中是否有任何祖先ID。

var cursor = db.<collectionName>.find({_id : {$nin : allAncesstorIds}}, {_id : 1})

迭代光标并在集合中插入所有缺少的文档。

cursor.forEach(function (missingDocId) {
  db.missing.insert(missingDocId);
});