2012-03-14 7 views
20

私のデータ構造は次のとおりです。mongodbとpymongoで空の文字列をテストします

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

「姓」は時々存在し、ときどきありませんし、いつかは「」です。

姓が ""でない行をすべて取得したいとします。しかし、これは機能しません。 lastnameが ""のときとlastnameが全く存在しないときの両方の行を返します。上記の例では、Davidノードのみを取得したいと考えています。 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 } 

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

答えて

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

あなたはまた、次のように基準を調整する必要がnull値に対する一致をフィルタしたい場合には(我々 $のもを取り除くことができます「$ね」として存在する:nullは、このの世話をする)

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

$ neの周りの引用符は、Pythonに必要です。式{$ ne: ""}は、level2_cが ""である場合と、level2_cノードが存在しない場合の両方でtrueと評価されます。だから、私は{"level2_c":{"$ exists":True}、 "level1_b.level2_c":{"$ ne": "}}のようにフィルタリングしなければなりませんでした。これは動作しますが、やや醜いです。 –

+1

私はmongoシェルからテストしていました。あなたは正しい答えを見つけてうれしいです。 – Kyle

+0

ありがとうございます。私は少し質問を明確にした。もう一度見ていただけますか? {"lastname":{"$ exists":True}、 "lastname":{"$ ne": "}}? –

0

あなたは正規表現のクエリを使用することができます。

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

この正規表現は、先頭または0またはN空白(.|\s)で終わる文字列にマッチし、それが途中で\S 1以上の非空白文字でなければなりません。

関連する問題