Answers:
db.messages.find( { headers : { From: "reservations@marriott.com" } } )
这查询headers
等于的 文档{ From: ... }
,即不包含其他字段。
db.messages.find( { 'headers.From': "reservations@marriott.com" } )
这只会查看该headers.From
字段,而不受包含或缺少的其他字段的影响headers
。
conditions['some.path'] = 'value'
业务逻辑中的操作,然后最后运行一个查询:find(conditions, fields, callback);
domains.domain.com
。在这种情况下是否有任何解决方法(无需将domain.com更改为其他名称,例如domain_com)?
以不同的方式在两个查询机制工作,建议在该文档的部分子文档:
当字段包含嵌入式文档(即subdocument)时,您可以将整个子文档指定为字段的值,也可以使用点符号“进入” 子文档,以指定子文档中各个字段的值:
如果子文档与指定的子文档完全匹配(包括字段顺序),则子文档中的相等匹配会选择文档。
在下面的示例中,查询将匹配所有文档,其中字段生产者的值是子文档,该子文档仅包含company
具有值'ABC123'
的字段address
和具有值的字段'123 Street'
(按确切顺序):
db.inventory.find( {
producer: {
company: 'ABC123',
address: '123 Street'
}
});
由于对带有子文档的查询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()
之所以应该是一个,是因为这些查询中的文档headers
等于object {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
因此,它与指定的子文档完全匹配,包括field order。
对于使用点运算符,我认为每一个都非常清楚。让我们看看下面的查询结果:
> db.messages.find( { 'headers.From': "reservations@marriott.com" } ).count()
2
我希望上述示例的这些解释将使人们对使用子文档进行查询更为清晰。