我正在使用MongoDB PHP库并具有以下查询数组
Array
(
[$and] => Array
(
[0] => Array
(
[$or] => Array
(
[0] => Array
(
[role.name] => Array
(
[$in] => Array
(
[0] => 'User'
[1] => 'VIP User'
)
)
)
[1] => Array
(
[role._id] => Array
(
[$in] => Array
(
[0] => 'User'
[1] => 'VIP User'
)
)
)
)
)
)
)
哪个不起作用。但是,这样做:
Array
(
[$and] => Array
(
[0] => Array
(
[role.name] => Array
(
[$in] => Array
(
[0] => 'User'
[1] => 'VIP User'
)
)
)
)
)
知道问题是什么吗? (这是一个抽象的例子)
答案 0 :(得分:3)
除了冗余的$and
运算符之外,我没有看到您的查询出现问题。请考虑以下Mongo shell示例:
> db.foo.drop()
true
> db.foo.insert({role:{name:"User"}});
> db.foo.insert({role:{name:"Admin"}});
> db.foo.insert({role:{name:"VIP User"}});
> db.foo.find({$or:[{"role.name":{$in:["User", "VIP User"]}}, {"role._id":{$in:["User", "VIP User"]}}]});
{ "_id" : ObjectId("4fea16dcdb49621e28c004a2"), "role" : { "name" : "User" } }
{ "_id" : ObjectId("4fea16e8db49621e28c004a4"), "role" : { "name" : "VIP User" } }
> db.foo.find({$and:[{$or:[{"role.name":{$in:["User", "VIP User"]}}, {"role._id":{$in:["User", "VIP User"]}}]}]});
{ "_id" : ObjectId("4fea16dcdb49621e28c004a2"), "role" : { "name" : "User" } }
{ "_id" : ObjectId("4fea16e8db49621e28c004a4"), "role" : { "name" : "VIP User" } }
请注意,我的数据中没有role._id
字段,因此只是忽略了它。
如果您在使用JavaScript shell时遇到问题,请参阅$or and $and文档中的示例。两个运算符都期望数组作为它们的值,而数组又可以包含任意数量的有效标准对象。
$and
的主要好处是当您需要满足同一领域的多个标准时。如果字段名称不同,则它等同于简单地使用条件对象(其中隐式地使用键)。