2015-04-23 63 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