web-dev-qa-db-ja.com

mongodbとpymongoで空の文字列をテストします

これが私のデータ構造です。

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

「姓」が存在する場合と存在しない場合があり、「」が存在する場合もあります。

「」と等しくない姓を持つすべての行を取得したい。しかし、これは機能しません。 lastnameが ""の場合とlastnameがまったく存在しない場合の両方の行を返します。上記の例では、Davidノードのみを取得します。

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

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 }

Null値に対する一致を除外する場合は、次のように基準を調整する必要があります(「$ ne」として$ existsを削除することもできます。nullがこれを処理します)

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

正規表現クエリを使用できます。

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

この正規表現は、0またはN個の空白文字で始まるまたは終わる文字列に一致します(.|\s)そして、それは1つ以上の非空白スペースでなければなりません\S 途中で。

1
Marcos Godinho