MongoDB 查找集差异

MongoDB finding set differences

提问人:lesolorzanov 提问时间:11/8/2023 更新时间:11/8/2023 访问量:18

问:

比较两个集合中的一个属性以查找缺少哪些属性的最佳方法是什么?

我有两个集合“项目”和“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

使用聚合管道了解恢复集合中缺少哪些内容的最佳方法是什么?

mongoDB 比较 管道 聚合

评论


答:

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 上测试此解决方案

评论

1赞 ray 11/8/2023
我的想法和你差不多。我只是在子管道中使用它来限制像这样的返回文档的数量$limit: 1
0赞 lesolorzanov 11/9/2023
但这是否真的在 items 集合中创建了一个属性,只是稍后取消设置它?还有一个问题,本地和国外领域其实是item_name,我在$project阶段用吗?
0赞 Fourchette 11/9/2023
An 类似于查询,但具有各种运算符。无论如何,它都不会更新集合(像 这样的运算符除外)。因此,不,它不会在集合中创建属性。对于本地/外部字段,如果这是两个集合之间的唯一引用,则应更新它们。该阶段本身不是强制性的,它是为了限制查询处理的数据。在舞台上添加或删除内容不会产生任何影响。您甚至可以删除整体及其内容。aggregate$outitem_name$project$projectpipeline