0

私はMongoDBPHPライブラリを使用しており、次のクエリ配列があります

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シェルの例を考えてみましょう。

> 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シェルで問題が発生した場合は、 $orおよび$andのドキュメントの例を確認すると役立つ場合があります。どちらの演算子も、値として配列を期待します。配列には、任意の数の有効な基準オブジェクトを含めることができます。

の主な利点は$and、同じフィールドに対して複数の基準を満たす必要がある場合です。フィールド名が異なる場合は、単に基準オブジェクトを使用するのと同じです(キーは暗黙的にand-edされます)。

于 2012-06-26T20:16:41.593 に答える