在比较那些重复项中的某些字段时在 MongoDB 中查找重复项

Find Duplicate In MongoDB While Comparing Some Field In those Duplicate Items

我有一个数据库

[
  {
    "_id": 1,
    "email": "amrit@gmail.com",
    "status": "ACTIVE"
  },
  {
    "_id": 2,
    "email": "abc@gmail.com",
    "status": "INACTIVE"
  },
  {
    "_id": 3,
    "email": "tut@gmail.com",
    "status": "ACTIVE"
  },
  {
    "_id": 4,
    "email": "amrit@gmail.com",
    "status": "INACTIVE"
  },
  {
    "_id": 5,
    "email": "tut@gmail.com",
    "status": "ACTIVE"
  },
  {
    "_id": 6,
    "email": "cat@gmail.com",
    "status": "ACTIVE"
  },
  
]

现在我想根据电子邮件查找项目,其状态为 ACTIVE 和 INACTIVE。 我已经编写了查询来查找这样的重复项。

db.getCollection(‘employees’).aggregate([
    {$group: {
        _id: {email: “$email”},
        uniqueIds: {$addToSet: “$_id”},
        count: {$sum: 1}
        }
    },
    {$match: {
        count: {“$gt”: 1}
        }
    }
], {allowDiskUse:true });

This return tut@gmail.com 和 amrit@gmail.com 但我只想要 amrit@gmail.com 因为它在数据库中既是活动的又是非活动的。 结果应该类似于

{
    "_id": {
      "email": "amrit@gmail.com"
    },
    "uniqueIds": [
      4,
      1
    ]
  }

试试下面的查询。

db.getCollection("employees").aggregate([
  {
    $group: {
      _id: {
        email: "$email"
      },
      uniqueIds: {
        $addToSet: "$_id"
      },
      status: {
        $addToSet: "$status"
      }
    }
  },
  {
    $match: {
      status: {
        "$all": [
          "ACTIVE",
          "INACTIVE"
        ]
      }
    }
  },
  {
    $project: {
      status: 0
    }
  }
])

这是给你的 MongoPlayground