mongodb - 如何在一个集合中查找另一个集合中的文档未引用的 MongoDB 文档?
问题描述
我正在 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
to的反向引用,以免出现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
}
}
])
推荐阅读
- sql - SSMS 将存储过程结果导出为 .csv 文件,并在每个月的第 12 个工作日进行调度
- sql - 需要根据条件从 2 个不同的表中生成一列
- xcode - 相对 Xcode Storyboard 约束
- arrays - 在 bash 数组中存储 awk 输出的问题
- vuejs2 - 发出的事件不由 Vue 2 中的父组件处理
- reactjs - Reactjs-通过axios向服务器发布新笔记后如何修复,渲染什么都不显示?
- c# - 如何解决“当我编写用于搜索的存储过程时”?
- java - 在这种情况下,多个 if 和 if-else 有什么区别?
- angular - mat-select 中的样式复选框具有多个选项
- python - Python - 使用 Ipyvolume 库在 x、y 和 z 轴上绘制不同颜色的问题