2016-06-03 11 views
1

Die Abfrage geht alsBitte erläutern Sie diese mongodb Abfrage und das Ergebnis

db.restaurants.find({$and : [{"grades.score" : {$gt:80}},{"grades.score" : {$lt:100}}]}) 

folgt es mit der Idee im Kopf des Abrufens Restaurants mit einer Punktzahl von 80 bis 100

geschrieben wurde, warum hat diese Abfrage Rückkehr das folgende Dokument in seinem Ergebnis. Das unten stehende Dokument enthält kein Notenelement im Unterdokument der Noten, das in den Bereich von "größer als 80 UND kleiner als 100" fällt.

Ich habe versucht, diese

{ 
    "_id" : ObjectId("572eb5df1d739cc73c21fab1"), 
    "address" : { 
      "building" : "65", 
      "coord" : [ 
        -73.9782725, 
        40.7624022 
      ], 
      "street" : "West 54 Street", 
      "zipcode" : "10019" 
    }, 
    "borough" : "Manhattan", 
    "cuisine" : "American ", 
    "grades" : [ 
      { 
        "date" : ISODate("2014-08-22T00:00:00Z"), 
        "grade" : "A", 
        "score" : 11 
      }, 
      { 
        "date" : ISODate("2014-03-28T00:00:00Z"), 
        "grade" : "C", 
        "score" : 131 
      }, 
      { 
        "date" : ISODate("2013-09-25T00:00:00Z"), 
        "grade" : "A", 
        "score" : 11 
      }, 
      { 
        "date" : ISODate("2013-04-08T00:00:00Z"), 
        "grade" : "B", 
        "score" : 25 
      }, 
      { 
        "date" : ISODate("2012-10-15T00:00:00Z"), 
        "grade" : "A", 
        "score" : 11 
      }, 
      { 
        "date" : ISODate("2011-10-19T00:00:00Z"), 
        "grade" : "A", 
        "score" : 13 
      } 
    ], 
    "name" : "Murals On 54/Randolphs'S", 
    "restaurant_id" : "40372466" 
} 

Antwort

2

Verwendung Dies geschieht, weil beide Bedingungen erfüllt sind. Wenn Sie keine Indizes für grades.score angeben, durchsucht es alle Elemente des Arrays. Und es tut finden Sie einen Artikel mit score > 80 (131). Zur gleichen Zeit gibt es andere Elemente, die weniger als 100 sind.

In der menschlichen Sprache fordern Sie "ein Dokument, das Ergebnis größer als 80 enthält und gleichzeitig Ergebnis weniger als 100 enthält". Sie geben nicht an, dass es dieselbe Bewertung sein soll, die diese Bedingungen erfüllt.

Was Sie suchen Ich denke, ist eine Abfrage für die gleichzeitige Überprüfung der Reichweite für jedes Element.

{ "grades" : { $elemMatch: { score: { $gt:80, $lt:100 } } } } 
+0

zurück, also gibt es keine Möglichkeit, dies mit einem einfachen $ und? weil ich dachte, dass es Dokumente zurückgeben sollte, die beide der $ und – Newton

+1

zufrieden stellten, da ich bereits erwähnt habe, dass Sie mit einem Array umgehen. Sie sollten Mongo also anweisen, alle Elemente des Arrays zu durchlaufen und zu überprüfen, ob eines der Elemente die Bedingung erfüllt. Dies geschieht durch den Operator '$ elemMatch'. Ich habe meine Antwort mit einer Erklärung bearbeitet. Hoffe, es hilft –

+0

oh, ich dachte, wenn ich ein $ und es würde zu 2 Bedingungen in 1. kombinieren, sondern stattdessen prüft es für die Gültigkeit von beiden. Mit elemMatch bekommt man die richtige Antwort. Kannst du eine schnelle Antwort geben? Kann dies mit "grades.score" erreicht werden? – Newton

0

Ja, wie von @Kirill Slatin gesagt, Ihre beiden Bedingungen sind in diesem Fall wahr. Also, für Ihr gewünschtes Ergebnis Besuche die folgenden Lösung mit einer Erklärung für besseres Verständnis:

Mit $ lte und separat $ gte,

db.products.find({score:{$gt:'80'}}) 

db.products.find({score:{$lt:'100'}}) 

erste Anweisung wird das Ergebnis mit Score von 80 zurückzukehren und gretaer als 80 und die zweite Anweisung wird die Punktzahl Ergebnisse mit 100 zurückkehren und weniger als 100

$ lt Verwendung und $ gt zusammen

db.products.find({score:{$gt:80,$lt:100}}) 

Die obige Abfrage gibt die Ergebnisergebnisse größer als 80 und weniger als 100

+0

wo Sie das GT und lt zusammen verwenden. Soll es nur die Dokumente zurückgeben, deren Wert zwischen 80 und 100 liegt? – Newton

+0

ja, natürlich .. das war ein Beispiel, Sie können die Werte gemäß Ihrer Anforderung ändern. – Aparna

+0

aber es tut nicht. Diese db.restaurants.find ({"grade.score": {$ gt: 80, $ lt: 100}}) gibt mir 1 Dokument (in der Frage erwähnt), wo keiner der Punkte zwischen 80 und 100 liegt. – Newton

Verwandte Themen