我正在MonogDB中寻找一种有效的方法来确定一个集合中的哪些文档未被另一个集合中的文档引用。
该数据库包含两个集合inventory
和tags
,其中inventory
中的某些(不是全部)文档引用了tags
文档之一:
{
"_id" : ObjectId("5e8df3c02e197074f39f61ea"),
"tag" : ObjectId("5e89a1af96d5d8b30aead768"),
"ean" : "5707196199178",
"location" : "shelf 1"
},
{
"_id" : ObjectId("5e8df211727079cdc24e20e1"),
"ean" : "5707196199178",
"location" : "shelf 1"
}
“标签”文档没有引用inventory
中的文档:
{
"_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还是很陌生,到目前为止,我已经了解到,可能是我需要的一种视图。但是我似乎缺乏合适的搜索词来查找示例,这些示例可以帮助我理解足够的内容以继续进行操作。也许我需要一些不同的东西,在这里我希望您的意见能为我指明正确的方向。
答案 0 :(得分:1)
您需要使用$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
}
}
])