Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在集合中过滤mongoDB中的查询_Javascript_Mongodb_Mongoose_Mongoid - Fatal编程技术网

Javascript 如何在集合中过滤mongoDB中的查询

Javascript 如何在集合中过滤mongoDB中的查询,javascript,mongodb,mongoose,mongoid,Javascript,Mongodb,Mongoose,Mongoid,我试图在mongoDB中进行过滤,但没有得到预期的输出。我正在使用$elemMatch,但仍然没有达到预期效果 代收代收 [ { "_id": "5d402d36035f3063657240ac", "name": "test agency", "msisdn": "99961110278", "apps": [ { "pincodes": [ "135001", "122018"

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

代收代收

[

  {
    "_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
}]
预期产出

[
{
  "_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
}]
您可能需要这样做

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将返回完整的数组。如果只需要匹配的元素,则需要对数据使用聚合。以下查询可以获得预期的输出:

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再次分组信息

请您解释一下您的疑问。。!!关于文档,此查询“根据指定的条件选择要返回的数组子集”,在本例中,条件为<代码>{“$$app.name”:{$regex:'DSB',$options:'i'},$$app.pincodes:{$in:['135001','134002']}
input
apps
字段,
as
“表示输入数组的每个元素”。