2013-08-20 12 views
5

Mam kolekcję unitScores, gdzie każdy dokument ma identyfikator oraz szereg dokumentów takiego:

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

Mam dwie znaleźć zapytania:

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

i

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

Spodziewam się, żeby dać taki sam efekt, ale przy użyciu identyfikatora użytkownika wejściowy i unitId z

wersja z notacją kropkową zwraca nieprawidłowy wpis tablicy (ten z wynikiem: 17), a $ elemMatch zwraca poprawny wpis (ten z wynikiem: 33). Dlaczego?

+1

Czy możesz dołączyć rzeczywisty dokument, który przekazujesz, do zapytania lub (jak wygląda) kodu Java, którego używasz do utworzenia zapytania? Wygląda na to, że powinni oboje pracować. – Mason

Odpowiedz

3

$elemMatch to nie ta sama logika, co notacja kropkowa. $elemMatch wymaga tych samych zagnieżdżonych elementów, aby mieć wartości. Użycie notacji kropek pozwala, aby wszystkie elementy zagnieżdżone miały wartości. W ten sposób widzisz różne wyniki, ponieważ logika zapytania jest inna.