2012-06-26 5 views
0

J'utilise la bibliothèque PHP MongoDB et ont la matrice de requête suivante

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' 
         ) 
        ) 
       ) 
      ) 
     ) 
    ) 
) 

Ce qui ne fonctionne pas. Cependant, cela fait:

Array 
(
    [$and] => Array 
    (
     [0] => Array 
     (
      [role.name] => Array 
      (
       [$in] => Array 
       (
        [0] => 'User' 
        [1] => 'VIP User' 
       ) 
      ) 
     ) 
    ) 
) 

Une idée du problème? (Ceci est un exemple abstrait)

+0

Essayez-les dans le shell mongo –

+0

@SergioTulentsev J'ai essayé, mais je ne connais même pas la syntaxe de base pour le shell. En outre, j'ai normalement des problèmes pour traduire des exemples de shell en PHP. –

+0

Eh bien, personnellement, j'ai des difficultés à traduire les vidages de var PHP en quelque chose de significatif. Trop de bruit visuel :) –

Répondre

3

Je ne vois pas de problème avec vos requêtes, mis à part l'opérateur $and redondant. Prenons l'exemple suivant shell 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" } } 

Notez qu'il n'y a pas un champ role._id dans mes données, il a été tout simplement ignoré.

Si vous rencontrez des problèmes avec le shell JavaScript, il peut être utile de parcourir les exemples de la documentation $or and $and. Les deux opérateurs s'attendent à ce que leur valeur soit un tableau, qui peut à son tour contenir un nombre quelconque d'objets de critères valides.

Le principal avantage de $and est lorsque vous devez satisfaire à plusieurs critères pour le même champ. Si les noms de champs sont différents, cela équivaut à utiliser simplement un objet de critère (où les clés sont implicitement éditées).

+0

Le problème n'était pas avec ma requête mais ailleurs dans mon architecture. J'ai le $ et la déclaration parce que mon code réel génère beaucoup de $ ou déclarations entre autres choses, mais je pourrais essayer de le retirer une fois que j'ai tout le reste de travail, juste pour voir ce qui se passe –

Questions connexes