如何查询嵌套对象?

时间:2013-04-14 18:21:50

标签: mongodb syntax nested mongodb-query bson

使用嵌套对象表示法查询mongoDB时遇到问题:

db.messages.find( { headers : { From: "reservations@marriott.com" } } ).count()
0
db.messages.find( { 'headers.From': "reservations@marriott.com" }  ).count()
5

我看不出我做错了什么。我期望嵌套对象表示法返回与点表示法查询相同的结果。我哪里错了?

3 个答案:

答案 0 :(得分:355)

db.messages.find( { headers : { From: "reservations@marriott.com" } } )

此查询headers 等于 { From: ... }的文档,即不包含其他字段。


db.messages.find( { 'headers.From': "reservations@marriott.com" } )

仅查看headers.From字段,不受headers中包含或缺失的其他字段的影响。


Dot-notation docs

答案 1 :(得分:19)

两个查询机制以不同的方式工作,如{em> Subdocuments 部分the docs中所述:

当该字段包含嵌入文档(即子文档)时,您可以指定整个子文档作为字段的值,或者“到达” 子文档使用点表示法,为子文档中的各个字段指定值

子文档中的等式匹配选择文档,如果子文档完全匹配指定的子文档,包括字段顺序。


在下面的示例中,查询匹配所有文档,其中字段生成器的值是仅包含值为company的字段'ABC123'和字段address的子文档的子文档值'123 Street',按照确切的顺序:

db.inventory.find( {
    producer: {
        company: 'ABC123',
        address: '123 Street'
    }
});

答案 2 :(得分:1)

由于对用子文档查询mongodb集合存在很多困惑,我认为有必要用示例来解释以上答案:

首先,我仅在集合中插入两个对象,即:message as:

> db.messages.find().pretty()
{
    "_id" : ObjectId("5cce8e417d2e7b3fe9c93c32"),
    "headers" : {
        "From" : "reservations@marriott.com"
    }
}
{
    "_id" : ObjectId("5cce8eb97d2e7b3fe9c93c33"),
    "headers" : {
        "From" : "reservations@marriott.com",
        "To" : "kprasad.iitd@gmail.com"
    }
}
>
  

那查询的结果是什么:db.messages.find({headers: {From: "reservations@marriott.com"} }).count()

应为 one ,因为此查询将查询headers等于对象{From: "reservations@marriott.com"},仅包含其他字段的文档,否则我们应指定整个子文档作为字段的值。

所以根据@ Edmondo1984的答案

  
    

如果子文档完全匹配指定的子文档(包括字段顺序),则子文档中的“相等匹配”选择文档。

  

从上面的语句来看,下面的查询结果应该是什么?

> db.messages.find({headers: {To: "kprasad.iitd@gmail.com", From: "reservations@marriott.com"}  }).count()
0

如果我们更改FromTo的顺序(即与第二文档的子文档相同)怎么办?

> db.messages.find({headers: {From: "reservations@marriott.com", To: "kprasad.iitd@gmail.com"}  }).count()
1
  

因此,它完全匹配指定的子文档,包括字段顺序

对于使用点运算符,我认为每一个都非常清楚。让我们看看下面的查询结果:

> db.messages.find( { 'headers.From': "reservations@marriott.com" }  ).count()
2

希望通过示例进行说明,以便使人们更加清楚查找带有子文档的查询