我正在 MonogDB 中寻找一种有效的方法来确定一个集合中的哪些文档未被另一个集合中的文档引用。
数据库包含两个集合,inventory
和 tags
,其中 inventory
中的一些(不是全部)文档引用了 之一标签
文档:
{
"_id" : ObjectId("5e8df3c02e197074f39f61ea"),
"tag" : ObjectId("5e89a1af96d5d8b30aead768"),
"ean" : "5707196199178",
"location" : "shelf 1"
},
{
"_id" : ObjectId("5e8df211727079cdc24e20e1"),
"ean" : "5707196199178",
"location" : "shelf 1"
}
“标签”文档没有引用库存
中的文档:
{
"_id" : ObjectId("5e7d174fc63ce5b0ca80b89a"),
"nfc" : { "id" : "04:5f:ae:f2:c2:66:81" },
"barcode" : { "code" : "29300310", "type" : "EAN8" }
},
{
"_id" : ObjectId("5e89a1af96d5d8b30aead768"),
"nfc" : { "id" : "04:48:af:f2:c2:66:80" },
"barcode" : { "code" : "29300716", "type" : "EAN8" }
},
{
"_id" : ObjectId("5e7d1756c63ce5b0ca80b89c"),
"nfc" : { "id" : "04:02:ae:f2:c2:66:81" },
"barcode" : { "code" : "29300648", "type" : "EAN8" }
}
由于并非 tags
中的所有文档都在 inventory
文档中使用,因此我不能简单地将它们作为子文档。
现在我需要确定哪些tags
文档不被任何inventory
文档引用。我不想维护从 tags
到 inventory
的反向引用,以免出现不一致的风险(除非这可以由 MongoDB 自动完成?)。
我对 MongoDB 非常陌生,从到目前为止我所了解到的情况来看,我的印象是 View 可能就是我所需要的。但我似乎缺乏适当的搜索词来找到可以帮助我充分理解以继续进行的示例。也许我需要一些不同的东西,我希望您的意见能为我指明正确的方向。
最佳答案
您需要使用 $lookup 执行 MongoDB 聚合允许连接两个集合的运算符。
如果存在“tags
文档未被任何inventory
文档引用”,join
字段将为空数组。
下一步,我们使用 $size
运算符过滤空数组。
尝试下面的查询:
db.tags.aggregate([
{
$lookup: {
from: "inventory",
localField: "_id",
foreignField: "tag",
as: "join"
}
},
{
$match: {
"join": {
$size: 0
}
}
},
{
$project: {
join: 0
}
}
])
关于mongodb - 如何在一个集合中查找未被另一集合中的文档引用的 MongoDB 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61116699/