MongoDB(11) - 検索編(4回目)

今回は空文字/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 }

上記データを一覧にまとめると下記のようになります。

_idname
1""
2null
3(nameフィールドなし)
4undefined

空文字/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

# MongoDB操作用のインスタンスを作成
client = MongoClient() # [IPとポートを指定する場合] MongoClient('10.200.243.203', 27017')

# データベースの取得
db1 = client.db1

# Null検索
for doc in db1.col1.find({'name': None}):
print(doc)

# フィールドの存在有無検索($exists)
for doc in db1.col1.find({'name': {'$exists':False} }):
print(doc)

# データ型指定検索($type)
for doc in db1.col1.find({'name': {'$type':'null'} }):
print(doc)

次回は配列、オブジェクトの値で検索を行います。