2013-08-20 10 views
5

ich eine unitScores Sammlung haben, wobei jedes Dokument eine ID und eine Reihe von Dokumenten wie diese hat:

"_id": ObjectId("52134edd5b1c2bb503000001"), 
"scores": [ 
    { 
     "userId": ObjectId("5212bf3869bf351223000002"), 
     "unitId": ObjectId("521160695483658217000001"), 
     "score": 33 
    }, 
    { 
     "unitId": ObjectId("521160695483658217000001"), 
     "userId": ObjectId("5200f6e4006292d308000008"), 
     "score": 17 
    } 
] 

Ich habe zwei finden Anfragen:

_id:new ObjectID(scoreId) 
"scores.userId":new ObjectID(userId) 
"scores.unitId":new ObjectID(unitId) 

und

_id:new ObjectID(scoreId) 
scores: 
    $elemMatch: 
    userId:new ObjectID(userId) 
    unitId:new ObjectID(unitId) 

ich würde erwarten, dass sie das gleiche Ergebnis geben, aber mit dem Eingang userId und unitid von

Die Punktnotationsversion gibt den falschen Feldeintrag zurück (der mit der Punktzahl: 17) und $ elemMatch gibt den korrekten Eintrag zurück (der mit der Punktzahl: 33). Warum das?

+1

Können Sie das tatsächliche Dokument, das Sie übergeben, in die Abfrage oder den Java-Code einfügen, den Sie zum Erstellen der Abfrage verwenden? Scheint so, als ob sie beide arbeiten sollten. – Mason

Antwort

3

$elemMatch ist nicht die gleiche Logik wie Punktnotation. $elemMatch erfordert die gleichen verschachtelten Elemente, um die Werte zu haben. Die Verwendung der Punktnotation ermöglicht es allen verschachtelten Elementen, Werte zu haben. Dadurch sehen Sie unterschiedliche Ergebnisse, da die Abfragelogik unterschiedlich ist.