我正在使用带有祖先数组的模型树结构,我需要检查是否缺少任何文档。
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调用中?
答案 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);
});