Подтвердить что ты не робот

Проверьте пустую строку в mongodb и pymongo

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

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

"lastname" иногда присутствует, а иногда нет, а иногда "".

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

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

Ответ 1

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

В оболочке mongo (id опущен для экономии места)

> 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 }

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

> db.collection.find({$and:[{"lastname": {"$ne": null}}, {"lastname": {"$ne": ""}}]})
  { "name" : "Kyle", "lastname" : "Test" }

Ответ 2

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

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

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