Операторы сравнения MongoDB с null
в MongoDB я хотел бы использовать операторы сравнения $gt и $lt, где значение может быть null. Когда операторы не работали с null, Я искал документацию, но не нашел. В обоих случаях он не возвращал никаких документов (хотя $ne, $gte и $lte возвращали документы; то есть были документы, которые были равны и не равны null).
Я ожидал бы, что $gt по существу будет работать как $ne (как null тип Монго сравнения ордер настолько низкий) и $lt, чтобы ничего не возвращать по той же причине.
Я надеялся, что это будет работать, поскольку значение, которое я передаю запросу, является переменным (потенциально null), и я не хочу писать специальный чехол для null.
пример того, что я expeccting, учитывая следующую коллекцию:
{
id: 1,
colNum: null
}
{
id: 2,
colNum: 72
}
{
id: 3
}
Я ожидал бы следующее запрос:
db.testtable.find( { "colNum" { $gt : null } } )
вернуться:
{
id: 2,
colNum: 72
}
однако ничего не было возвращено.
есть ли причина, по которой $gt и $lt, похоже, не работают с null, или это ошибка MongoDB, или она на самом деле должна работать, и есть вероятность ошибки пользователя?
1 ответов
Подробности
чтение последний источник Монго, есть в основном 2 случая, когда делают сравнения с участием null
:
- если канонических типов сравниваемых элементов BSON различны, только сравнения равенства (
==
,>=
,<=
) null & undefined вернетtrue
; в противном случае любое сравнение сnull
вернутсяfalse
.
Примечание: нет другой тип BSON имеет тот же канонический тип, что иnull
. - если канонических типов такие же (т. е. оба элемента
null
), то compareElementValues называется. Дляnull
, Это просто возвращает разницу между канонического типа обоих элементов BSON, а затем выполняет запрошенное сравнение с0
.
Например,null > null
перевел бы(5-5) > 0 --> False
потому что канонический тип null это 5.
Аналогично,null < null
перевел бы(5-5) < 0 --> False
.
это значит null
может быть равен только null
или undefined
. Любое другое сравнение, включающее null
всегда будет возвращать false
.
это ошибка?
Обновленный Ответ:
документация для операторов сравнения ( $gt, $lt) ссылки документация, которую вы первоначально связанный, что означает, что операторы сравнения должны работы с null
. Кроме того, сортировка запросов (то есть, db.find().sort()
) тут точно следуйте задокументированному поведению сравнения / сортировки.
это, по крайней мере, непоследовательно. Я думаю, что стоит отправить отчет об ошибке в сайт Jira MongoDB.
Оригинальный Ответ:
я не подумайте, что это поведение является ошибкой.
на общий консенсус для Javascript это undefined
означает неназначенные пока null
означает назначено, но в остальном не определено. Сравнение значений с неопределенными, помимо равенства, не имеет смысла, по крайней мере в математическом смысле.
учитывая, что BSON сильно использует JavaScript, это относится и к MongoDB.