在具有值条件的数组中重复

duplicates in array with condition of value

Monogplayground

我有以下带有数组的文档(名称 gists)。文档示例:

 {
    "_id": ObjectId("60a2c0621e5f043b735e36ef"),
    "car_id": 78,
    "terminal": "JFK",
    "gists": [
      "A",
      "M",
      "C",
      "D",
      "Q",
      "J",
      "F"
    ]
  }, 

我的 objective 是查询所有包含重复“A”的文档并获取它们的 car_id.

虽然我可以找到重复项,但我无法在 gists 中找到“A”的结果。

db.collection.aggregate([
  {
    "$project": {
      "gists": 1
    }
  },
  {
    "$unwind": "$gists"
  },
  {
    "$group": {
      "_id": {
        "_id": "$_id",
        "cid": "$gists"
      },
      "count": {
        "$sum": 1
      }
    }
  },
  {
    "$match": {
      "$and": [
        {
          "count": {
            "$gt": 1
          }
        },
        {
          "gists": "A"  **//<---- this is where I get it off. Gist must contain A in the array**
        }
      ]
    }
  },
  {
    "$group": {
      "_id": "$_id._id",
      "gists": {
        "$addToSet": "$_id.cid"
      }
    }
  }
])

您可以尝试 $expr 表达式运算符和聚合运算符,

  • $filter 迭代 gists 数组的循环并检查值“A”
  • $size 从上面过滤的结果中得到总元素
  • $gt 检查上面的大小是否大于 1
  • $group为null并构造car_id
  • 的数组
db.collection.aggregate([
  {
    $match: {
      $expr: {
        $gt: [
          {
            $size: {
              $filter: {
                input: "$gists",
                cond: { $eq: ["$$this", "A"] }
              }
            }
          },
          1
        ]
      }
    }
  },
  {
    $group: {
      _id: null,
      car_id: { $push: "$car_id" }
    }
  }
])

Playground

结果:

[
  {
    "_id": null,
    "car_id": [79, 80]
  }
]