Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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
Mongodb 在单独的数组中查找具有相同值的两个字段_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

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

Mongodb 在单独的数组中查找具有相同值的两个字段,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有上面这样的数据库。我希望查找字段first_name和last_name的type=primary。我尝试了此代码,但它获取了所有数据: "first_name" : [ ] 我该怎么做呢。提前感谢通过向两个属性提供值作为查询条件,您可以始终“匹配”包含这两个属性的文档。但要获得与两者的位置匹配,您需要使用aggregate: var fieledUsers = { 'first_name': 1, 'last_name': 1

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

"first_name" : [ 

    ]
我该怎么做呢。提前感谢

通过向两个属性提供值作为查询条件,您可以始终“匹配”包含这两个属性的文档。但要获得与两者的位置匹配,您需要使用aggregate:

 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) {

可以与标准查询一起使用的元素可以很好地匹配数组中的“单个”元素。但是对于多个匹配,或者在这种情况下,匹配可以在每个数组中处于“不同”的位置,则需要对进行这种操作。还以从数组中提取单个元素为例。

根据MongoDB文档

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
      ]
    }
  }}
])
根据上述描述,作为解决方案,请尝试在MongoDB shell中执行以下查询

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

谢谢,成功了。但它得到数据库中的所有数据,我只想得到名字和姓氏的文件。我该怎么办it@ThanhTùng如果您只需要这些字段,请使用而不是。这实际上不是
$elemMatch
的用途。相反,它的用途是在“多个条件”上匹配单个元素,通常作为多个属性。因此,OP和我自己使用的“查询”部分是正确的,也是最佳的。正如前面提到的问题,因此“问题”是for投影只返回“匹配的第一个位置”。因此,对于“两个”数组,一个数组中匹配的位置可能与另一个数组中的位置不同。因此,问题不在于匹配“文档”,因为该部分已经完成。问题是关于。“匹配数组元素”。MongoDB需要
$filter
才能返回正确的响应。
db.collection.find({first_name:{$elemMatch:{type:'primary'}}, 
last_name:{$elemMatch:{type:'primary'}}})