提问人:lesolorzanov 提问时间:11/8/2023 更新时间:11/8/2023 访问量:18
MongoDB 查找集差异
MongoDB finding set differences
问:
比较两个集合中的一个属性以查找缺少哪些属性的最佳方法是什么?
我有两个集合“项目”和“items_recovery” 项目如下所示
{
_id: ObjectId("64789354c78b2fd7db3ebea"),
item_name: 'BIKE_1032_HE_files/17/1_45',
...
}
db> db.items_recovery.find().count()
6174859
db> db.items.find().count()
6362241
有索引item_name
使用聚合管道了解恢复集合中缺少哪些内容的最佳方法是什么?
答:
0赞
Fourchette
11/8/2023
#1
您可以使用简单的方法来查找已经恢复的文档。然后,您可以推断出没有恢复的文档,因为它们有 0 匹配的恢复。$lookup
以下是如何实现该示例:
db.item.aggregate([
{
"$lookup": {
"from": "item_recovery",
"localField": "_id",
"foreignField": "_id",
"pipeline": [
{
"$project": {
_id: 1
}
}
],
"as": "hasRecovery"
}
},
{
$match: {
$expr: {
$eq: [
{
$size: "$hasRecovery"
},
0
]
}
}
},
{
$unset: "hasRecovery"
}
])
您可以在 mongoplayground 上测试此解决方案
评论
0赞
lesolorzanov
11/9/2023
但这是否真的在 items 集合中创建了一个属性,只是稍后取消设置它?还有一个问题,本地和国外领域其实是item_name,我在$project阶段用吗?
0赞
Fourchette
11/9/2023
An 类似于查询,但具有各种运算符。无论如何,它都不会更新集合(像 这样的运算符除外)。因此,不,它不会在集合中创建属性。对于本地/外部字段,如果这是两个集合之间的唯一引用,则应更新它们。该阶段本身不是强制性的,它是为了限制查询处理的数据。在舞台上添加或删除内容不会产生任何影响。您甚至可以删除整体及其内容。aggregate
$out
item_name
$project
$project
pipeline
评论