使用嵌套对象表示法查询mongoDB时遇到问题:
db.messages.find( { headers : { From: "reservations@marriott.com" } } ).count()
0
db.messages.find( { 'headers.From': "reservations@marriott.com" } ).count()
5
我看不出我做错了什么。我期望嵌套对象表示法返回与点表示法查询相同的结果。我哪里错了?
答案 0 :(得分:355)
db.messages.find( { headers : { From: "reservations@marriott.com" } } )
此查询headers
等于 { From: ... }
的文档,即不包含其他字段。
db.messages.find( { 'headers.From': "reservations@marriott.com" } )
仅查看headers.From
字段,不受headers
中包含或缺失的其他字段的影响。
答案 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
如果我们更改From
和To
的顺序(即与第二文档的子文档相同)怎么办?
> 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
希望通过示例进行说明,以便使人们更加清楚查找带有子文档的查询。