如何在 collection 中过滤 mongoDB 中的查询

How to filter query in mongoDB in collection

我正在尝试在 mongoDB 中进行过滤,但没有得到预期的输出。我正在使用 $elemMatch 但仍然没有得到预期。

机构Collection

[

  {
    "_id": "5d402d36035f3063657240ac",
    "name": "test agency",
    "msisdn": "99961110278",
    "apps": [
      {
        "pincodes": [
          "135001",
          "122018"
        ],
        "_id": "5d402d36035f3063657240ae",
        "name": "DSB"
      },
      {
        "pincodes": [
          "135001",
          "122017"
        ],
        "_id": "5d402d36035f3063657240ad",
        "name": "DBH"
      }
    ],
    "__v": 0
  }
]

查询 shell

db.Agency.find({'apps':{$elemMatch:{name: {$regex: 'DSB', $options: 'i'} ,pincodes: { $in : ['135001','134002']}}}})

获取输出

[
{
  "_id" : "5d401d4aba592260507479d2",
  "name" : "test agency",
  "msisdn" : "99961110278",
  "apps" : [
    {
      "pincodes" : [
        "135001",
        "122017"
      ],
      "_id" : "5d401d4aba592260507479d3",
      "name" : "DSB"
    }
  ],
  "__v" : 0
}
,
{
  "_id" : "5d402249035f3063657240a9",
  "name" : "test agency",
  "msisdn" : "99961110278",
  "apps" : [
    {
      "pincodes" : [
        "135001",
        "122017"
      ],
      "_id" : "5d402249035f3063657240ab",
      "name" : "DSB"
    },
    {
      "pincodes" : [
        "135001",
        "122017"
      ],
      "_id" : "5d402249035f3063657240aa",
      "name" : "DBH"
    }
  ],
  "__v" : 0
}
,
{
  "_id" : "5d402d36035f3063657240ac",
  "name" : "test agency",
  "msisdn" : "99961110278",
  "apps" : [
    {
      "pincodes" : [
        "135001",
        "122018"
      ],
      "_id" : "5d402d36035f3063657240ae",
      "name" : "DSB"
    },
    {
      "pincodes" : [
        "135001",
        "122017"
      ],
      "_id" : "5d402d36035f3063657240ad",
      "name" : "DBH"
    }
  ],
  "__v" : 0
}]

预期输出

[
{
  "_id" : "5d401d4aba592260507479d2",
  "name" : "test agency",
  "msisdn" : "99961110278",
  "apps" : [
    {
      "pincodes" : [
        "135001",
        "122017"
      ],
      "_id" : "5d401d4aba592260507479d3",
      "name" : "DSB"
    }
  ],
  "__v" : 0
}
,
{
  "_id" : "5d402249035f3063657240a9",
  "name" : "test agency",
  "msisdn" : "99961110278",
  "apps" : [
    {
      "pincodes" : [
        "135001",
        "122017"
      ],
      "_id" : "5d402249035f3063657240ab",
      "name" : "DSB"
    }
  ],
  "__v" : 0
}
,
{
  "_id" : "5d402d36035f3063657240ac",
  "name" : "test agency",
  "msisdn" : "99961110278",
  "apps" : [
    {
      "pincodes" : [
        "135001",
        "122018"
      ],
      "_id" : "5d402d36035f3063657240ae",
      "name" : "DSB"
    }
  ],
  "__v" : 0
}]

您可能需要 $filter 才能执行此操作。

db.Agency.aggregate([
  {
    $project: {
      apps: {
        $filter: {
           input: "$apps",
           as: "app",
           cond: {"$$app.name": {$regex: 'DSB', $options: 'i'} ,"$$app.pincodes": { $in : ['135001','134002']}}
        }
     }
    }
  }
])

您也可以通过 $group$match 以其他方式进行。

db.getCollection('test').aggregate([
  {$match: {"apps.name": {$regex: 'DSB', $options: 'i'}}}, // Return only data which name is DSB
  {$unwind: "$apps"}, // Convert array to object (To remove DTH data in same document)
  {$match: {"apps.name": {$regex: 'DSB', $options: 'i'}, // Again filter with DSB and pincodes "apps.pincodes": { $in : ['135001','134002']}}},
  {$group: { // Finall group it again. So we will have only DSB related data
    _id: "$_id",
    name: {$first: "$name"},
    msisdn: {$first: "$msisdn"},
    __v: {$first: "$__v"},
    apps: {$push: "$apps"}
  }}
])
如果数组中的任何元素符合条件,

MongoDB 将 return 完整数组。如果您只需要匹配的元素,则需要对数据使用聚合。以下查询可以获得预期的输出:

db.agency.aggregate([
    {
        $unwind:"$apps"
    },
    {
        $match:{
            "apps.name":{
                $regex: "DSB", 
                $options: 'i'
            },
            "apps.pincodes": { 
                $in : ['135001','134002']
            }
        }
    },
    {
        $group:{
            "_id":"$_id",
            "name":{
                $first:"$name"
            },
            "msisdn":{
                $first:"$msisdn"
            },
            "apps":{
                $push:"$apps"
            },
            "__v":{
                $first:"$__v"
            }
        }
    }
]).pretty()
  • 第一阶段:打开数组并为每个数组元素创建单独的文档
  • 第二阶段:申请条件
  • 第三阶段:根据_id再次分组信息