我正在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的新手,到目前为止,我已经了解到可能是我需要的一种视图。但是我似乎缺乏合适的搜索词来查找示例,这些示例可以帮助我理解足够的内容以继续进行操作。也许我需要一些不同的东西,在这里我希望您的意见能为我指明正确的方向。
您需要使用$ 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
}
}
])
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句