我有一个集合(用户),看起来与下面提到的非常相似。
db.users.find().pretty();
{
"_id" : ObjectId("5773fc2826e0b6cf532569ca"),
"user" : {
"login" : "tester"
}
}
{
"_id" : ObjectId("5773fd6426e0b6cf532569cb"),
"user" : {
"login" : "tester",
"name" : "anil"
}
}
当我这样做时
> db.users.find({"user":{"login":"tester"}});
我得到了这个结果
{ "_id" : ObjectId("5773fc2826e0b6cf532569ca"), "user" : { "login" : "tester" } }
但是当我在下面做的时候,我没有记录。
db.users.find({"user":{"name":"anil"}});
> 所以我的问题是为什么第二个查询没有返回任何响应?
另外,基于上面的例子,我甚至怀疑这是否是访问子文档的正确方法?
不应通过.notation访问子文档。像下面的东西? (在这种情况下,我在两种情况下都得到了正确的输出)
db.users.find({"user.login":"tester"});
{ "_id" : ObjectId("5773fc2826e0b6cf532569ca"), "user" : { "login" : "tester" } }
{ "_id" : ObjectId("5773fd6426e0b6cf532569cb"), "user" : { "login" : "tester", "name" : "anil" } }
和
> db.users.find({"user.name":"anil"});
{ "_id" : ObjectId("5773fd6426e0b6cf532569cb"), "user" : { "login" : "tester", "name" : "anil" } }
>
答案 0 :(得分:3)
另外,基于上面的例子,我甚至怀疑这是不是 访问子文档的正确方法?
实际上并非这样。第一个查询user
表示您正在寻找完全等于{"login":"tester"}
对象的login
,而不是tester
字段等于{{{}的用户1}}。有一个文档与该条件匹配,该文档实际上作为查询结果返回。
同样,第二个查询db.users.find({"user":{"name":"anil"}});
表示您正在寻找完全等于user
对象的{"name":"anil"}
。没有这样的user
。有一个文档部分与您的查询匹配,但这还不够。
如果您正在寻找user
name
等于anil
的{{1}},请使用 Dot Notation 来访问子文档,就像您一样在你的第二组查询中做了。
不应该通过.notation访问子文档。就像是 在下面? (在这种情况下,我在两种情况下都得到了正确的输出)
是。这是正确的方法。