Mongo Query question $ gt, $ lt - PullRequest
       2

Mongo Query question $ gt, $ lt

24 голосов
/ 11 февраля 2011

У меня есть запрос ниже.Я хочу получить элементы от 4 до 6, поэтому только a: 1 должно совпадать, поскольку оно имеет значение 5 в b.

> db.test.find({ b : { $gt :  4  }, b: {$lt : 6}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>

Может кто-нибудь сказать, почему a: 2 соответствует этому запросу?Я не могу понять, почему он возвращается.

Я также пробовал то, что было указано в учебном пособии, но id, похоже, не работал:

> db.test.find({ b : { $gt :  4, $lt : 6}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>

И этот, чтобы избежать каких-либопутаница в отношении GT / GTE

> db.test.find({b: {$gt: 4.5, $lt: 5.5}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>

должна быть возвращена только a: 1.

Как и предполагалось, я дал $ elemMatch попытку, но она тоже не сработала (objectIds отличаются, потому чтоЯ на другом компьютере)

> db.test.find();
{ "_id" : ObjectId("4d5a24a5e82e00000000433f"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d5a24bbe82e000000004340"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
> db.test.find({b: {$elemMatch: {$gt : 4, $lt: 6 }}});
>

Документы не возвращены.

Ответы [ 4 ]

65 голосов
/ 11 февраля 2011

Это действительно запутанная тема.Я работаю в 10gen, и мне пришлось потратить некоторое время на то, чтобы обдумать это;)

Давайте посмотрим, как обработчик запросов обрабатывает этот запрос.

Вот снова запрос:

> db.test.find({ b : { $gt :  4, $lt : 6}});

Когда доходит до записи, которая, кажется, не должна совпадать ...

{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 4, 6, 8 ] }

Совпадение невыполняется против каждого элемента массива, а против массива в целом.

Сравнение выполняется в три этапа:

Шаг 1 : Найти все документы, в которых значение b больше 4

b: [2, 4,6,8] соответствует, потому что 6 & 8 больше 4

Шаг 2 : Найти все документы, где значение b меньше 6

b:[2,4,6,8] соответствует, потому что 2 & 4 меньше 6

Шаг 3 : найдите набор документов, которые соответствуют обоим шагам 1 и 2.

Документ с b: [2,4,6,8] соответствует обоим шагам 1 и 2, поэтому он возвращается как совпадающий.Обратите внимание, что на этом этапе результаты также не дублируются, поэтому один и тот же документ не будет возвращен дважды.

Если вы хотите, чтобы ваш запрос применялся к отдельным элементам массива, а не к массиву в целом, вы можете использовать оператор $ elemMatch.Например

> db.temp.find({b: {$elemMatch: {$gt: 4, $lt: 5}}})
> db.temp.find({b: {$elemMatch: {$gte: 4, $lt: 5}}})
  { "_id" : ObjectId("4d558b6f4f0b1e2141b66660"), "b" : [ 2, 3, 4, 5, 6 ] }
5 голосов
/ 25 февраля 2016

$ гт

Syntax: {field: {$gt: value} }

например:

db.inventory.find( { qty: { $gt: 20 } } )

$ lt

Syntax: {field: {$lt: value} }

например:

db.inventory.find( { qty: { $lt: 20 } } )

eg2:

db.inventory.find({ qty : { $gt :  20, $lt : 60}});
0 голосов
/ 28 октября 2015
.find( {$and:[ {b:{$gt:4}}, {b:{$lt:6}} ]} )
0 голосов
/ 11 февраля 2011

Потому что вы не проверяли документацию.

См.

http://www.mongodb.org/display/DOCS/Advanced+Queries

и проверьте наличие «диапазонов» на странице.

Синтаксис вашего запроса также неверен (сравните с примером)

и ваша часть вопроса «почему a: 2» не имеет смысла, так как «a» не участвует в вашем запросе. Если вы хотите найти: 1, то вам нужно включить его в свой запрос.

Имейте в виду, что по умолчанию все предложения запроса И объединяются, если вы не используете оператор $ или.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...