2012-03-14 55 views
20

这是我的数据结构。在mongodb和pymongo中测试空字符串

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

“lastname”有时存在,有时不存在,有时是“”。

我想获取所有具有姓氏不等于“”的行。但这不起作用。它在姓氏为“”时以及姓氏根本不存在时返回两行。在上面的例子中,我只想得到David节点。

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

回答

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

在蒙戈外壳(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 } 

如果你也想筛选出对你的需要调整标准如下空值相匹配(我们也可以摆脱$存在为“$ NE”:空照顾这个)

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

python需要$ ne左右的引号。所以当level2_c为“”时以及当level2_c节点不存在时,表达式{$ ne:“”}的计算结果为true。所以我必须像这样过滤它们{“level2_c”:{“$ exists”:True},“level1_b.level2_c”:{“$ ne”:“”}}。这有效,但看起来有些丑陋。 – 2012-03-14 01:27:59

+1

我正在从mongo shell进行测试。很高兴你找到了正确的答案。 – Kyle 2012-03-14 01:30:10

+0

谢谢。我澄清了一下这个问题。你能再请看看吗?有没有比这更好的答案:{“lastname”:{“$ exists”:True},“lastname”:{“$ ne”:“”}}? – 2012-03-14 01:42:11

0

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

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

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