今回は空文字/Null/フィールドなし/undefinedに関する検索を行います。
サンプルデータ
次のようなデータをcol1コレクションに設定します。
[Mongoシェル]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| > db.col1.insertOne({_id:1, name:""}) { "acknowledged" : true, "insertedId" : 1 }
> db.col1.insertOne({_id:2, name:null}) { "acknowledged" : true, "insertedId" : 2 }
> db.col1.insertOne({_id:3}) { "acknowledged" : true, "insertedId" : 3 }
> db.col1.insertOne({_id:4, name:undefined}) { "acknowledged" : true, "insertedId" : 4 }
> db.col1.find() { "_id" : 1, "name" : "" } { "_id" : 2, "name" : null } { "_id" : 3 } { "_id" : 4, "name" : undefined }
|
上記データを一覧にまとめると下記のようになります。
| _id | name |
| 1 | "" |
| 2 | null |
| 3 | (nameフィールドなし) |
| 4 | undefined |
空文字/Null/フィールドなし/undefinedの説明
各データの説明は以下の通りです。
- 空文字
0バイトの文字列です。空文字はString型として扱われます。
- null
nullはNull型として扱われます。
- フィールドなし
MongoDBではドキュメントごとにフィールドが異なります。
そのためフィールド自体がないということがありえます。
- undefined
JavaScriptではundefinedという型があります。
値がないけれどもnullでもないという特殊な型です。
Null検索
Null検索を行います。
[Mongoシェル]
1 2 3 4
| > db.col1.find({name:null}) { "_id" : 2, "name" : null } { "_id" : 3 } { "_id" : 4, "name" : undefined }
|
nameフィールドがnullのドキュメントだけではなく、nameフィールドのないドキュメントとundedinedのドキュメントも検索対象となるので注意が必要です。
フィールドの存在有無検索($exists)
フィールドの存在有無を検索する$existsを使って検索してみます。
[Mongoシェル]
1 2
| > db.col1.find({name:{$exists:false}}) { "_id" : 3 }
|
$existsにfalseを指定すると、そのフィールドが存在しないドキュメントだけが検索されます。
データ型指定検索($type)
$typeにデータ型“null”を指定して検索を行います。
[Mongoシェル]
1 2
| > db.col1.find({name:{$type:"null"}}) { "_id" : 2, "name" : null }
|
nameフィールドがnullのドキュメントだけが検索対象となります。
String型であるかどうかを調べるためには“string”、配列型かどうかを調べるためには“array”を指定します。
その他のデータ型は下記の公式ページをご参照下さい。
MongoDB $typeのデータ型 - https://docs.mongodb.com/manual/reference/operator/query/type/
まとめ
上記の検索結果を一覧にまとめると下記のようになります。
“〇”が検索対象になるドキュメントで、”—“が検索対象にならないドキュメントです。
| データ型 | Null検索 | $exists(false)検索 | $type("null")検索 |
| 空文字 | --- | --- | --- |
| Null型 | 〇 | --- | 〇 |
| フィールドなし | 〇 | 〇 | --- |
| undefined | 〇 | --- | -- |
Pythonで操作
上記の検索をPythonで行うと、次のようになります。
[ソースコード]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| from pymongo import MongoClient
client = MongoClient()
db1 = client.db1
for doc in db1.col1.find({'name': None}): print(doc)
for doc in db1.col1.find({'name': {'$exists':False} }): print(doc)
for doc in db1.col1.find({'name': {'$type':'null'} }): print(doc)
|
次回は配列、オブジェクトの値で検索を行います。