Проверьте пустую строку в mongodb и pymongo - PullRequest
29 голосов
/ 14 марта 2012

Вот моя структура данных.

[{
"name": "David",
"lastname": "",
},
{
"name": "Angela"
}]

иногда присутствует "фамилия", а иногда нет, а иногда - "".

Я хочу получить все строки, чье имя не равно "".Но это не работает.Он возвращает обе строки, когда lastname равно "" и когда lastname вообще отсутствует.в приведенном выше примере я хочу получить только узел Давида.

db.collection.find( {"lastname": {"$ne": ""}} )

Ответы [ 2 ]

79 голосов
/ 14 марта 2012
db.collection.find({"lastname" : {"$exists" : true, "$ne" : ""}})

В оболочке mongo (идентификатор не указан для экономии места)

> db.collection.find()
  { "name" : "Angela" }
  { "name" : "David", "lastname" : "" }
  { "name" : "Kyle",  "lastname" : "Test" }
  { "name" : "John",  "lastname" : null }

> db.collection.find({"lastname" : {"$exists" : true, "$ne" : ""}})
  { "name" : "Kyle", "lastname" : "Test" }
  { "name" : "John",  "lastname" : null }

Если вы также хотите отфильтровать совпадения по нулевым значениям, вам нужно настроить критерии следующим образом (мы также можемизбавиться от $ существует как "$ ne": об этом позаботится null)

> db.collection.find({$and:[{"lastname": {"$ne": null}}, {"lastname": {"$ne": ""}}]})
  { "name" : "Kyle", "lastname" : "Test" }
1 голос
/ 05 января 2018

Вы можете использовать регулярное выражение:

db.test.find({ "lastname": /(.|\s)*\S(.|\s)*/ })

Это регулярное выражение соответствует строкам, начинающимся или заканчивающимся 0 или N пробелами (.|\s), и это должен быть один или несколько непробельных символов \S в середине.

...