2015-04-23 93 views
1

我有一個這樣的MongoDB的文檔中的所有匹配的數組元素,的MongoDB:查找單個文檔

{ 
    "_id" : ObjectId("4e8ae86d08101908e1000001"), 
    "eId": 101, 
    "about": "test", 
    "tags" : [ 
      {"name": "jana"}, 
      {"name":"bala"}, 
      {"name":"jk"}, 
      {"name":"charles"} 
    ] 
} 

我需要找到所有匹配的數組元素,在給定陣列相匹配的名稱。

db.coll.find({"tags": {"$elemMatch": {"name": {"$in": [/^jana/i, /^charles/i] }}}}) 

此查詢我得到以下結果

{ 
    "_id" : ObjectId("4e8ae86d08101908e1000001"), 
    "tags" : [ 
     { 
      "name" : "jana" 
     } 
    ] 
} 
只有

$ elemMatch查詢返回的第一個匹配元素,但我想所有匹配的數組元素就是這樣,

{ 
    "_id" : ObjectId("4e8ae86d08101908e1000001"), 
    "tags" : [ 
     { 
      "name" : "jana" 
     }, 
     { 
      "name" : "charles" 
     } 
    ] 
} 

是否有可能得到這樣的結果?

注:我不想讓任何外人田,我想只能用_id

回答

2

沿着匹配的數組元素可以使用MongoDB的Aggregation Pipeline

db.coll.aggregate([ 
    {'$unwind': '$tags'}, 
    {'$match': 
     {"tags.name": 
      {"$in": [/^jana/, /^charles/i] } 
     } 
    }, 
    {'$group': 
     { 
      '_id': '$_id', 
      'tags': 
       {'$push': '$tags'} 
     } 
    } 
]) 

結果: -

{ 
    "result" : [ 
     { 
      "_id" : ObjectId("5538b214706a90c718f75a41"), 
      "tags" : [ 
       { 
        "name" : "jana" 
       }, 
       { 
        "name" : "charles" 
       } 
      ] 
     } 
    ], 
    "ok" : 1 
} 
+0

沒有聚合框架,有沒有其他解決方案? – Jana

+0

我不這麼認爲,投影中的[''elemMatch''](http://docs.mongodb.org/manual/reference/operator/projection/elemMatch/#proj._S_elemMatch)將只返回第一個元素匹配條件。 – thegreenogre