2013-03-04 1 views
0

Considérez le document suivant:

{ 
    "_id" : ObjectId("5130f9a677e23b11503fee55"), 
    "ItemType" : "Bicycle" 
    "Attributes" : [{ 
     "AttributeName" : "Spare Tire", 
     "AttributeValue" : "1" 
    }, { 
     "AttributeName" : "With helmet?", 
     "AttributeValue" : "0" 
    }, { 
     "AttributeName" : "Number of Locks", 
     "AttributeValue" : "1" 
    }] 
} 

Comment puis-je écrire la requête pour obtenir vélos avec pneu de rechange et pas de casque?

J'ai essayé ce qui suit mais cela ne me donne pas ce que je veux.

{ 
"$and" : 
[ 
    { "ItemType" : "Bicycle" }, 
    { "$and": 
     [{ "Attributes.AttributeName" : "With helmet?" }, 
     { "Attributes.AttributeValue" : "0" } 
    ]}, 
    { "$and": 
     [{ "Attributes.AttributeName" : "Spare Tire" }, 
     { "Attributes.AttributeValue" : "1" } 
    ]} 
]} 

Il semble que, tant qu'il y a une valeur qui correspond à Attributes.AttributeValue - quel que soit le Attributes.AttributeName d'accompagnement - il renvoie ce document. Il est comme avoir cette requête:

{ 
"$and" : 
[ 
    { "ItemType" : "Bicycle" },      //true 
    { "Attributes.AttributeName" : "With helmet?" }, //true 
    { "Attributes.AttributeName" : "Spare Tire" },  //true 
    { "Attributes.AttributeValue" : "0" },    //any 
    { "Attributes.AttributeValue" : "1" }    //any 
]} 

Répondre

3

Je crois que vous cherchez $elemMatch ici, de sorte qu'il veille à ce que le correspoding AttributeName et AttributeValue sont dans le même élément d'un champ à valeurs multiples (http://docs.mongodb.org/manual/reference/operator/elemMatch/):

{ 
    ItemType: 'Bicycle', 
    $and:[ 
     {"Attributes": {$elemMatch:{AttributeName: 'With helmet?', AttributeValue: 0 }}}, 
     { //Next match } 
    ] 
} 

Essayez quelque chose comme ça