MongoDb查询结构

时间:2017-07-12 09:32:39

标签: mongodb mongodb-query

我有一个文档结构的集合如下:

"_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的方式匹配状态。 有人可以解释一下这两个查询之间的区别吗?

2 个答案:

答案 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"})

<强>结论: -

如果您不想通过嵌入文档中的所有字段进行查询,

点符号查询会更好。