在Mongo中搜索多个子文档

时间:2016-06-27 03:47:16

标签: mongodb mongodb-query

鉴于以下收集:

{
    name: User1
    tags: [
        {k:"group", v:"test"},
        {k:"color", v:"blue"}
    ]
},
{
    name: User2
    tags: [
        {k:"group", v:"dev"},
        {k:"color", v:"blue"}
    ]
},
{
    name: User3
    tags: [
        {k:"group", v:"dev"},
        {k:"color", v:"red"}
    ]
}

如何搜索"tags"字段以查找给定用户。

例如User2,我可以一次搜索一个匹配的标记:

db.users.find({tags: {$elemMatch: {k:"group", v:"dev"}}})

结果为:User2 and User3。或

db.users.find({tags: {$elemMatch: {k:"color", v:"blue"}}}) 

结果为:User1 and User2

但是当我尝试做的时候

db.users.find({tags: {$elemMatch: {$and: [{k:"group", v:"dev"}, {k:"color", v:"blue"}]})

我没有比赛。

如何搜索User2记录?

3 个答案:

答案 0 :(得分:1)

通过$ elemMatch

使用$ all运算符,我得到了我想要的结果
db.task.find({tags: {$all: [
    {$elemMatch: {k:"group", v:"dev"}}, 
    {$elemMatch: {k:"color", v:"blue"}}
  ]}})

有关详细信息,请参阅doc

答案 1 :(得分:0)

您可以使用Aggregate()来解决您的问题。

尝试此查询: -

db.users.aggregate([
   {$project: {'name': 1}}, 
   {$unwind: '$tags'},
   {$match: {'k':     'group', 'v': 'dev'}}
 ])

https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/emphasized text

答案 2 :(得分:-1)

尝试此查询:

db.temp4.find({$and:[{"tags":{"k":"group","v":"dev"}},{"tags":{"k":"color","v":"blue"}}]})

返回所需的结果