测试mongodb和pymongo中的空字符串

时间:2012-03-14 00:22:00

标签: mongodb pymongo

这是我的数据结构。

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

“lastname”有时会出现,有时不会出现,有时会出现“”。

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

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

4 个答案:

答案 0 :(得分:74)

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

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

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

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

答案 1 :(得分:1)

您可以使用正则表达式查询:

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

此正则表达式匹配以0或N空格(.|\s)开头或结尾的字符串,并且它必须是中间的一个或多个非空格\S

答案 2 :(得分:0)

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

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

使用此方法,我只能得到非空字符串,也将忽略null和不存在的字段,因为任何可打印的值(ASCII)的值都大于空格(32)。

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

答案 3 :(得分:0)

我不确定这是否有帮助,但它对我有用。正则表达式 .+ 返回包含超过 1 个字符的任何内容,而 .* 返回 0 或更多。所以它不会返回少于 0 个字符的任何内容。

就仅包含空格的字符串而言,我认为此解决方案无法处理。