MongoDB:从单个文档中查找所有匹配的数组元素

时间:2015-04-23 08:45:30

标签: arrays regex 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

1 个答案:

答案 0 :(得分: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
}