考虑集合orgs
:
db.orgs.save({"name":"bbc","people":[{"user_id":new ObjectId(),"role":"admin"},{"user_id":new ObjectId(),"role":"user"}]})
是:
db.orgs.find().pretty()
以下结构:
{
"_id" : ObjectId("5316c81cb338e1a08a386367"),
"name" : "bbc",
"people" : [
{
"user_id" : ObjectId("5316c81cb338e1a08a386365"),
"role" : "admin"
},
{
"user_id" : ObjectId("5316c81cb338e1a08a386366"),
"role" : "user"
}
]
}
因此,如果我们查询user_id:5316c81cb338e1a08a386366
和role:admin
:
db.orgs.find({
"people.user_id":ObjectId("5316c81cb338e1a08a386366"),
"people.role":"admin"
}).pretty()
它会找到该文档(尽管user_id 5316c81cb338e1a08a386366
具有角色user
)。
我错过了什么吗?
以下示例使用点表示法来查询文档 memos字段的值是一个至少有一个的数组 包含等于“准时”的字段备忘录的子文档和 字段等于'运费':
db.inventory.find(
{
'memos.memo': 'on time',
'memos.by': 'shipping'
}
)
答案 0 :(得分:2)
尝试使用$elemMatch:
db.orgs.find({ people: { $elemMatch: { user_id: ObjectId("5316c81cb338e1a08a386366"), role: 'admin' } } })
答案 1 :(得分:1)
只是一些解释:您正在将普通查询与数组查询混合在一起。
您的查询不仅将返回同一索引中user_id:5316c81cb338e1a08a386366
数组中role:admin
和people
的文档,还会返回包含两者都有,但不在people
数组的相同索引中。
如果对数组执行常规查询,则会查看整个数组,并检查数组中是否存在这两个条件。因此,为了返回bbc
文档,您需要提供的是一个role-user_id对,它存在于people数组中 - 独立索引。如果你想拥有所需的行为,那么你应该使用@Pierre的答案,$elemMatch
。阅读documentation。
关于您提供的文档示例,它确实假设memos
不是数组。如果它是一个数组,则相同的条件将成立。