MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Заявката връща повече от очакваните резултати

Това поведение се очаква и е обяснено в документацията на mongo тук .

Mongo изглежда желае да играе "самодоволно", като връща резултати, когато комбинация от елементи на масив отговаря на всички условия независимо.

В нашия пример 5 съответства на условието $lt:20, а 25 съответства на условието $gt:10. Значи съвпадение е.

И двете от следните ще върнат резултата [5,25]:

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

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

Ако това е очакваното от потребителя поведение, мненията могат да се различават. Но със сигурност е документиран и трябва да се очаква.

Редактиране , за садистичната, но изключително образователна редакция на Нийл на оригиналния отговор, с искане за решение:

Използване на $elemMatch може да прави "по-строги" сравнения на елементи само за масиви .

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

Забележка :това ще съответства както на x:[11,12] и x:[11,25]

Вярвам, че когато е необходима заявка като тази, комбинация от две се изискват заявки и резултатите се комбинират. По-долу е дадена заявка, която връща правилни резултати за документи, като x не е масив :

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

Но най-добрият подход в този случай е да промените типа x на винаги да бъде масив, дори когато съдържа само един елемент. След това се изисква само заявката $elemMatch, за да получите правилни резултати с очаквано поведение.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Изтегляне на MongoDB Java

  2. Интегриране на mongodb с neo4j, има ли API, който да ги свърже?

  3. Поддръжка на обхват с течение на времето

  4. Защо получавам това отхвърлено предупреждение?! MongoDB

  5. MongoDB обобщава върнатия брой от 0, ако няма резултати