如何查询嵌套对象?

Edm*_*984 191 syntax nested mongodb bson mongodb-query

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

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

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

shx*_*hx2 378

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

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


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

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


点符号文档

  • @trysis是为了什么? (3认同)
  • @trysis - 在实践中,我发现声明内联对象(如mongo [ose] docs中的示例,以及大多数示例中的示例)仅仅在现实世界中是不够的.我养成了创建'条件'和'字段'对象的习惯,我可以在我的业务逻辑中执行诸如`conditions ['some.path'] ='value'`之类的操作,然后在最后运行一个查询: `find(conditions,fields,callback);` (3认同)
  • 回答我自己的评论,最好避免在按键中完全使用点。在我的解决方案中,我完全放弃了作为键的域,并创建了一个切片/数组。 (2认同)

Edm*_*984 19

这两个查询机制以不同的方式工作,如Subdocuments部分的文档中所建议:

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

如果子文档完全匹配指定的子文档(包括字段顺序),则子文档内的等式匹配选择文档.


在下面的示例中,查询匹配所有文档,其中字段生成器的值是一个子文档,该子文档仅包含company具有值'ABC123'的字段address和具有值的字段,'123 Street'具体顺序如下:

db.inventory.find( {
    producer: {
        company: 'ABC123',
        address: '123 Street'
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 我疯了.这在我看来非常不一致,因为在查询对象时,它的直接属性可以按任何顺序匹配. (8认同)

kri*_*sad 14

由于查询 MongoDB collection with sub-documents存在很多混淆,我认为值得用示例解释上述答案:

首先,我在集合中只插入了两个对象,即:message作为:

> 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"
    }
}
>
Run Code Online (Sandbox Code Playgroud)

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

它应该是一个,因为这些对headers等于 object 的文档的查询{From: "reservations@marriott.com"},仅 ie 不包含其他字段,或者我们应该将整个子文档指定为字段的值。

所以根据@Edmondo1984的回答

如果子文档与指定的子文档完全匹配,包括字段 order ,则子文档中的相等匹配选择文档。

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

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

如果我们改变第二个文档的子文档的顺序From和顺序To怎么办?

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

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

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

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

我希望以上示例的这些解释将使人们更清楚地了解带有子文档的查找查询