2015-06-03 19 views
6

używam wersji 2.6.5 MongoDB i mam kolekcję, która wygląda mniej więcej tak:MongoDB zapytanie produkuje lub odpowiedź zamiast I

{ 
    "_id": ObjectId("555a3398f4c572a44f877dcd"), 
    "created": ISODate("2015-05-18T17:02:14.951Z"), 
    "values": [ 
    { 
     "value": "4", 
     "label": "Apple" 
    }, 
    { 
     "value": "5", 
     "label": "Peach" 
    }, 
    { 
     "value": "5", 
     "label": "Banana" 
    }, 
    { 
     "value": "4", 
     "label": "Orange" 
    } 
    ], 
    "__v": 0 
} 
{ 
    "_id": ObjectId("555a74dbdfe135105faccdf7"), 
    "created": ISODate("2015-05-18T21:27:37.064Z"), 
    "values": [ 
    { 
     "value": "2", 
     "label": "Apple" 
    }, 
    { 
     "value": "3", 
     "label": "Peach" 
    }, 
    { 
     "value": "4", 
     "label": "Banana" 
    }, 
    { 
     "value": "5", 
     "label": "Orange" 
    } 
    ], 
    "__v": 0 
} 
{ 
    "_id": ObjectId("555a74f9dfe135105faccdfa"), 
    "created": ISODate("2015-05-18T21:27:37.064Z"), 
    "values": [ 
    { 
     "value": "1", 
     "label": "Apple" 
    }, 
    { 
     "value": "1", 
     "label": "Peach" 
    }, 
    { 
     "value": "1", 
     "label": "Banana" 
    }, 
    { 
     "value": "1", 
     "label": "Orange" 
    } 
    ], 
    "__v": 0 
} 

Kiedy próbuję dostać dokument, który ma values.label z „Orange” I values.value z „5” powinien dostać jeden dokument z powrotem, ale ja dostaję dwa:

> db.answers.count({ 'values.label':'Orange', 'values.value':'5' }) 
> 2 

to wybierając dwa dokumenty z identyfikatorami: 555a3398f4c572a44f877dcd (przypuszczalnie dlatego Banana także ma wartość 5) i 555a74dbdfe135105faccdf7 (który jest jedynym poprawnym). Czy ktokolwiek może pomyśleć, dlaczego tak się dzieje?

Odpowiedz

7

Używasz dot notation (używany do osiągnięcia obiektów) w tablicy. Chociaż działa to w sposób opisany przez ciebie, oznacza to logikę OR, ponieważ cała tablica jest interpretowana jako obiekt, że tak powiem.

Patrzysz pasujące do wielu kryteriów na dokumentów w tablicy, która jest co $elemMatch operator jest, to znaczy

db.answers.count({ 'values' : { '$elemMatch' : { 'label':'Orange', 'value':'5' } } }) 
+0

ma sens, dzięki! – jwerre

Powiązane problemy