0

我正在使用 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'
                )
            )
        )
    )
)

知道问题是什么吗?(这是一个抽象的例子)

4

1 回答 1

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是当您需要满足同一字段的多个标准时。如果字段名称不同,则相当于简单地使用条件对象(其中键是隐式和-ed)。

于 2012-06-26T20:16:41.593 回答