MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Zapytanie zwraca więcej niż oczekiwano wyników

To zachowanie jest oczekiwane i wyjaśnione w dokumentacji mongo tutaj .

Mongo wydaje się być chętny do zabawy w „smug”, dając wyniki, gdy kombinacja elementów tablicy spełnia wszystkie warunki niezależnie.

W naszym przykładzie 5 odpowiada warunku $lt:20, a 25 odpowiada warunku $gt:10. Więc to pasuje.

Oba poniższe zwrócą wynik [5,25]:

db.collection.find({ x: {$gt: 10, $lt: 20} })

db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })

Jeśli jest to zachowanie oczekiwane przez użytkownika, opinie mogą się różnić. Ale z pewnością jest to udokumentowane i należy się tego spodziewać.

Edytuj , za sadystyczną, ale bardzo edukacyjną edycję Neila do oryginalnej odpowiedzi, prosząc o rozwiązanie:

Korzystanie z $elemMatch może dokonywać „bardziej rygorystycznych” porównań elementów dla tablic .

db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20  } } })

Uwaga :pasuje zarówno do x:[11,12] i x:[11,25]

Wierzę, że gdy potrzebne jest takie zapytanie, kombinacja dwóch zapytania są wymagane, a wyniki połączone. Poniżej znajduje się zapytanie, które zwraca poprawne wyniki dla dokumentów, w których x nie jest tablicą :

db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )

Ale najlepsze podejście w tym przypadku należy zmienić typ x na zawsze być tablicą, nawet jeśli zawiera tylko jeden element. Wtedy do uzyskania poprawnych wyników z oczekiwanym zachowaniem wymagane jest tylko zapytanie $elemMatch.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Java MongoDB POST :415 nieobsługiwany typ nośnika

  2. NodeJS/ExpressJS wysyła odpowiedź dużej ilości danych w 1 strumieniu

  3. Porównanie wydajności MongoDB w chmurach publicznych:AWS, Azure i DigitalOcean

  4. Nie można usunąć z kolekcji mongodb angular MEAN stack

  5. Spring Data Mongo - Jak zmapować odziedziczone encje POJO?