2013-06-19 44 views
1

我有以下记录的嵌套阵列上执行与操作:如何在MongoDB中的查询对象

Record 1: 
{ 
    "status": "active", 
    "users": [ 
     { 
      "name": "foo", 
      "status": "a" 
     }, 
     { 
      "name": "foo", 
      "status": "b" 
     }   
    ] 
} 

Record 2: 
{ 
    "status": "active", 
    "users": [ 
     { 
      "name": "bar", 
      "status": "a" 
     }, 
     { 
      "name": "foo", 
      "status": "b" 
     }   
    ] 
} 

现在,我想返回只记录其中user.name是“富”和user.status是“一” - 这就是我需要记录1回,因为它满足我的要求。

如何对记录中的数组执行AND操作? 我尝试以下查询:

{ 
    "$and": [ 
     { 
      "users.name": "foo" 
     }, 
     { 
      "users.status": "a" 
     } 
    ] 
} 

,但我得到两个记录 - 我只需要在第一个记录(因为用户阵列中,它有一个条目,其中名称是“富”,状态为“一个”)。

任何线索?

回答

3

好吧,我找到了答案了here

的解决办法是有一个查询,如下所示:

{ 
    "users": { 
     "$elemMatch": { 
      "name": "foo", 
      "status": "a" 
     } 
    } 
} 

这奏效了!

0

除了单个字段值,您还可以在查询查询中使用整个对象。尝试:

db.collection.find({ 
    users: { 
     "name":"foo", 
     "status":"a" 
    } 
}); 

这应返回其中用户阵列包括一个对象(或是一个对象)所描述的,看起来所有文档。但需要注意的是,当物体具有额外的字段,这并不工作。

+0

所以你的意思是说,如果用户数组包含对象,并且这些对象包含'name'和'status'以外的字段,那么上述查询将不起作用?在我的情况下,是的 - 对象包含除上述两个等领域,但我不希望将其包含在查询 - 我该如何去做呢? – callmekatootie

+0

使用$ elemMatch像你已经想通了。 –

+0

@Philipp请注意,您的答案将无法正常工作 - 它只会匹配*确切*对象{“名”:“富”,“状态”:“一”} - 它甚至不会匹配用户有这两个字段以相反的顺序! –