2012-03-14 28 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

相關問題