2011-07-26 6 views
0

Toute idée pourquoi cette requête

{ 
    "_id": ObjectId("4e2a4ca7f21a81331f0006c3"), 
    "categories": { 
    "$nin": [ 
     "Arts" 
    ] 
    } 
} 

retourne l'enregistrement suivant lorsque nous excluons explicitement « Arts » avec nin $ ci-dessus?

{ 
    "_id": ObjectId("4e2a4ca7f21a81331f0006c3"), 
    "categories": { 
    "0": "Arts", 
    "1": "Arts - Performance" 
    } 
} 

comme un contrôle de santé mentale, j'ai changé nin $ à $ en

{ 
    "_id": ObjectId("4e2a4ca7f21a81331f0006c3"), 
    "categories": { 
    "$in": [ 
     "Arts" 
    ] 
    } 
} 

et il ne revint rien comme prévu .. mais je suis toujours perplexe par le résultat nin $ ci-dessus!

Répondre

0

Votre première requête demande un document avec un ID spécifique et où la valeur pour categories n'est pas dans une liste de chaînes (dans ce cas, ["Arts"]). La valeur de categories pour ce document est un document incorporé, { "0": "Arts", "1": "Arts - Performance" }.

La deuxième requête ne renvoie rien car ce document incorporé ne figure pas dans la liste de valeurs fournie pour le champ categories.

Edit: Si vous voulez être en mesure de rechercher des catégories à l'aide $in et $nin, vous devriez envisager de convertir la categories sous-document dans un tableau:

> db.foo.save({categories: ["Arts", "Arts - Performance"]})              
> db.foo.save({categories: ["Sports", "Sports - Baseball"]}) 
> db.foo.find({categories: {$nin: ["Arts"]}})     
{ "_id" : ObjectId("4e2e3b49aed2871354b374eb"), "categories" : [ "Sports", "Sports - Baseball" ] } 
> db.foo.find({categories: {$in: ["Arts"]}})     
{ "_id" : ObjectId("4e2e3b1eaed2871354b374ea"), "categories" : [ "Arts", "Arts - Performance" ] } 
+0

donc, _id de côté, ce qui est la bonne façon de rechercher uniquement des catégories autres que "Arts" en utilisant la structure de document existante? – bobby

+0

Édité ma réponse ci-dessus. – dcrosta

+0

merci beaucoup. oh, wow ... Je l'ai d'abord sauvé comme un tableau associatif ... que je suppose maintenant ne peut pas être recherché correctement en utilisant $ in/$ nin? par conséquent, la raison pour laquelle vous m'avez demandé de le convertir en un tableau 1d? – bobby