2014-11-08 61 views
1

我有这样如何从MongoDB获取匹配的子文件?

{ 
    "_id" : ObjectId("545dad3562fa028fb48832f0"), 
    "key" : "123456", 
    "members" : [ 
      { 
        "name" : "Shiva", 
        "country" : "India", 
        "profession" : "Software" 
      }, 
      { 
        "name" : "Neil", 
        "country" : "Australia", 
        "profession" : "Software" 
      }, 
      { 
        "name" : "anil", 
        "country" : "India", 
        "profession" : "Software" 
      } 

    ] 
} 

集合现在我想检索与国印度的记录。 当我试图这样

db.user_details.find({ 'key' :'123456','members':{$elemMatch:{'country': "India"}}}, {'members.$': 1}).pretty() 

在执行上面的代码我得到只有第一次出现,如何从文件

回答

3

$elemMatch运营商处获得所有匹配的子文档(如name:Shivaname:Anil)沿对方positional $运营商目前只会匹配符合指定条件的第一个元素。

为了得到“多于一个的”匹配,最好的方法是使用聚合框架:

db.user_details.aggregate([ 
    # Always match first to at least find the "documents" with matching elements 
    { "$match": { 
     "members.country": "India" 
    }}, 

    # Use $unwind to "de-normalize" the array as individual documents 
    { "$unwind": "$members" }, 

    # Then match again to "filter" the content down to matches 
    { "$match": { 
     "members.country": "India" 
    }}, 

    # Group back to keep an array 
    { "$group": { 
     "_id": "$_id", 
     "key": { "$first": "$key" }, 
     "members": { "$push": "$members" } 
    }} 
]) 

即用于从数组“过滤”多于一个的匹配的基本过程。基本投影目前不能做到。

它返回这样的:

{ 
    "_id" : ObjectId("545dad3562fa028fb48832f0"), 
    "key" : "123456", 
    "members" : [ 
      { 
        "name" : "Shiva", 
        "country" : "India", 
        "profession" : "Software" 
      }, 
      { 
        "name" : "anil", 
        "country" : "India", 
        "profession" : "Software" 
      } 
    ] 
} 
+0

我应该在哪里把我的'key'值在查询中,由于没有记录显示,上面的查询。 – Mulagala 2014-11-08 07:56:22

+0

@Mulagala相信我,如果我用你的数据对一个集合运行这个集合(现在纠正),那么它会返回匹配'“国家”的元素:“印度”。 – 2014-11-08 08:00:18

+0

是的,我明白了,我怎么才能得到一个特定的文件与给定的条件检查与键值123456.因为我得到的值与键'123'也不只是键vlaue'123456' – Mulagala 2014-11-08 08:10:49

相关问题