MongoDB: как запросить записи, в которых поле равно нулю или не задано?

106

У меня есть Emailдокумент с sent_atполем даты:

{
  'sent_at': Date( 1336776254000 )
}

Если это Emailне было отправлено, sent_atполе либо пустое, либо не существует.

Мне нужно получить количество отправленных / неотправленных Emails. Я застрял в попытке выяснить, как правильно запросить эту информацию. Я думаю, что это правильный способ получить количество отправленных:

db.emails.count({sent_at: {$ne: null}})

Но как мне подсчитать те, которые не отправлены?

Андрей
источник

Ответы:

16

Если вы хотите подсчитывать ТОЛЬКО документы с sent_atопределенным значением null(не считайте документы со значением sent_atnot set):

db.emails.count({sent_at: { $type: 10 }})
телевизоры
источник
Спасибо. Это очень полезно при проверке наличия поля, но с нулевым значением.
jstice4all
Проголосовали за, потому что при использовании findс plain nullон интерпретирует такие значения, как 0.0as, nullи это решение позволяет этого избежать
Маттиас Херрманн,
12

Использование:

db.emails.count({sent_at: null})

Подсчитываются все электронные письма, у которых свойство sent_at имеет значение null или не установлено. Вышеупомянутый запрос такой же, как и ниже.

db.emails.count($or: [
  {sent_at: {$exists: false}},
  {sent_at: null}
])
Анил Таллам
источник
8

Кажется, вы можете просто сделать одну строку:

{ "sent_at": null }
Джим Хорнг
источник
0

Вы также можете попробовать это:

db.emails.find($and:[{sent_at:{$exists:true},'sent_at':null}]).count()
Вивек Марайна
источник
0
db.employe.find({ $and:[ {"dept":{ $exists:false }, "empno": { $in:[101,102] } } ] }).count();
SagitSri
источник
Это не совсем ответ на вопрос. Если у вас есть другой вопрос, вы можете задать его, нажав « Задать вопрос» . Вы также можете добавить награду, чтобы привлечь больше внимания к этому вопросу. - Из
отзыва