我有一个文档结构的集合如下:
"_id": {
"userId": "user_id_1"
},
"val": {
"status": 1,
"otherKey": "otherValue"
}
我试图获取此文档有两个查询:
db.getCollection('my_collection').find({ "_id" : { "userId" : "user_id_1"} , "val.status" : 1})
和
db.getCollection('my_collection').find({ "_id" : { "userId" : "user_id_1"} , "val" : { "status" : 1}})
第一个查询返回文档而第二个查询没有。 我想以类似于用户ID的方式匹配状态。 有人可以解释一下这两个查询之间的区别吗?
答案 0 :(得分:1)
查询中的这个断言"val": { "status" : 1}
表示:返回val
等于JSON对象{"status": 1}
这不是这种情况,因为val
对象也有otherKey
字段
要使用此语法检索它,您应该使用
db.getCollection('my_collection').find(
{ "_id" : { "userId" : "user_id_1"} ,
"val" : { "status" : 1, "otherKey": "otherValue" }}
)
答案 1 :(得分:1)
当您查询嵌入式文档并编写OP中提到的查询(即第二个查询)时,MongoDB将完全包含字段顺序与嵌入文档匹配。
db.getCollection('my_collection').find({ "_id" : { "userId" : "user_id_1"} , "val" : { "status" : 1}})
如果您编写更改字段顺序的查询(即status和otherKey),则可能无法获得结果,因为MongoDB与嵌入文档完全匹配(即包含字段顺序的相同匹配)。
db.getCollection('my_collection').find(
{ "_id" : { "userId" : "user_id_1"} ,
"val" : {"otherKey": "otherValue", "status" : 1 }}
)
MongoDB对点表示法(即OP中的第一个查询)的工作方式不同。它没有如上所述执行精确匹配。它只是查找查询中提到的字段。
按状态查询:
db.getCollection('my_collection').find({ "_id" : { "userId" : "user_id_1"} , "val.status" : 1})
通过otherKey查询: -
db.getCollection('my_collection').find({ "_id" : { "userId" : "user_id_1"} , "val.otherKey" : "otherValue"})
<强>结论: - 强>
如果您不想通过嵌入文档中的所有字段进行查询,按点符号查询会更好。