测试mongodb和pymongo中的空字符串

Dav*_*han 31 mongodb pymongo

这是我的数据结构.

[{
"name": "David",
"lastname": "",
},
{
"name": "Angela"
}]
Run Code Online (Sandbox Code Playgroud)

"姓氏"有时存在,有时不存在,有时则为"".

我想获得所有姓氏不等于""的行.但这不起作用.当lastname为""并且lastname完全不存在时,它返回两行.在上面的例子中,我想只获取David节点.

db.collection.find( {"lastname": {"$ne": ""}} )
Run Code Online (Sandbox Code Playgroud)

Kyl*_*yle 85

db.collection.find({"lastname" : {"$exists" : true, "$ne" : ""}})
Run Code Online (Sandbox Code Playgroud)

在mongo shell中(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 }
Run Code Online (Sandbox Code Playgroud)

如果您还希望过滤掉空值匹配,则需要按如下方式调整条件(我们也可以将$ exists除去为"$ ne":null处理此问题)

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

  • 我相信你可以将`null`检查简化为:`db.collection.find({"lastname":{$ nin:["",null]}}) (7认同)
  • 我是从mongo shell测试的.很高兴你找到了正确的答案. (2认同)

小智 7

面对这个问题,我想到了另一个解决方案:

db.collection.find({"lastname": {"$gte": " "}})
Run Code Online (Sandbox Code Playgroud)

有了这个,我只能得到非空字符串,也忽略空和不存在的字段,因为任何可打印值 (ASCII) 都比空格 (32) 具有更大的值。

https://en.wikipedia.org/wiki/ASCII