Операторы сравнения 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:

  1. если канонических типов сравниваемых элементов BSON различны, только сравнения равенства (==, >=, <=) null & undefined вернет true; в противном случае любое сравнение с null вернутся false.
    Примечание: нет другой тип BSON имеет тот же канонический тип, что и null.
  2. если канонических типов такие же (т. е. оба элемента 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.