在单独的数组中查找具有相同值的两个字段

时间:2017-06-05 07:25:48

标签: mongodb mongodb-query aggregation-framework

"first_name" : [ 

    ]

我有上面的数据库。我想查找字段first_name和last_name有type = primary。我尝试了这段代码,但它获得了所有数据:

 var fieledUsers = {
            'first_name': 1,
            'last_name': 1,

            };
            var matching = {
                'first_name.type' :'primary',
                'last_name.type' :'primary'
            }
            var conditionUsers = {"_id": users_id};
            db.collection('users').aggregate([{$project:fieledUsers},{$match:matching}],function (err, resUsers) {

我该怎么办?提前谢谢

2 个答案:

答案 0 :(得分:1)

通过将两个属性的值作为查询条件提供,您始终可以“匹配”包含这两个属性的文档。但是为了使位置匹配两者,你需要$filter和aggregate:

db.collection.aggregate([
  { "$match": {
    "_id": users_id,
    "first_name.type": "primary",
    "last_name.type": "primary"
  }},
  { "$addFields": {
    "first_name": {
      "$arrayElemAt": [
        { "$filter": {
          "input": "$first_name",
          "as": "el",
          "cond": { "$eq": [ "$$el.type", "primary" ] }
        }},
        0
      ]
    },
    "last_name": {
      "$arrayElemAt": [
        { "$filter": {
          "input": "$last_name",
          "as": "el",
          "cond": { "$eq": [ "$$el.type", "primary" ] }
        }},
        0
      ]
    }
  }}
])

可以与标准查询一起使用的positional $ operator可以匹配数组中的“单个”元素。但是对于多个匹配,或者在这种情况下,匹配可以在每个数组中处于“不同”位置,那么需要使用$filter的这种操作。另外使用$arrayElemAt作为示例从数组中提取单个元素。

答案 1 :(得分:0)

根据MongoDB文档

The $elemMatch operator matches documents that contain an array 
field with at least one element that matches all the specified query 
criteria.

根据上述说明,请尝试在MongoDB shell中执行以下查询。

db.collection.find({first_name:{$elemMatch:{type:'primary'}}, 
last_name:{$elemMatch:{type:'primary'}}})