MongoDB(12) - 検索編(5回目)

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

サンプルデータ

次のようなデータをcol1コレクションに設定します。

[Mongoシェル]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
> db.col1.insertOne({name:"鈴木",
age:28,
skill:["English", "Python", "MongoDB", "Driving"],
child:[
{name:"あゆみ", age:5},
{name:"えりこ", age:2}
]})
{
"acknowledged" : true,
"insertedId" : ObjectId("61240eff1c53d262d76db31a")
}

> db.col1.insertOne({name:"佐藤",
age:15,
skill:["Thailand", "Oracle", "AI"]
})
{
"acknowledged" : true,
"insertedId" : ObjectId("61240f001c53d262d76db31b")
}

> db.col1.find()
{ "_id" : ObjectId("61240eff1c53d262d76db31a"), "name" : "鈴木", "age" : 28, "skill" : [ "English", "Python", "MongoDB", "Driving" ], "child" : [ { "name" : "あゆみ", "age" : 5 }, { "name" : "えりこ", "age" : 2 } ] }
{ "_id" : ObjectId("61240f001c53d262d76db31b"), "name" : "佐藤", "age" : 15, "skill" : [ "Thailand", "Oracle", "AI" ] }

配列の要素数で検索

配列の要素数で検索する場合は、$sizeを使います。

skill配列の要素数が3のドキュメントを検索してみます。

[Mongoシェル]

1
2
> db.col1.find({skill:{$size:3}})
{ "_id" : ObjectId("61240f001c53d262d76db31b"), "name" : "佐藤", "age" : 15, "skill" : [ "Thailand", "Oracle", "AI" ] }

配列の中に指定した値をすべて持つかどうかを検索

配列の中に指定した値がすべて含まれているかどうかを検索する場合には、$allを使います。

skill配列にPythonDrivingの両方が含まれているドキュメントを検索してみます。

[Mongoシェル]

1
2
> db.col1.find({skill:{$all:["Python", "Driving"]}})
{ "_id" : ObjectId("61240eff1c53d262d76db31a"), "name" : "鈴木", "age" : 28, "skill" : [ "English", "Python", "MongoDB", "Driving" ], "child" : [ { "name" : "あゆみ", "age" : 5 }, { "name" : "えりこ", "age" : 2 } ] }

オブジェクトの値で検索

サンプルデータの1つ目のドキュメントには、child配列の中にオブジェクトが設定されています。

配列の中のオブジェクトを指定して検索する場合は、“child.age”のように指定して検索できます。

[Mongoシェル]

1
2
> db.col1.find({"child.age":5})
{ "_id" : ObjectId("61240eff1c53d262d76db31a"), "name" : "鈴木", "age" : 28, "skill" : [ "English", "Python", "MongoDB", "Driving" ], "child" : [ { "name" : "あゆみ", "age" : 5 }, { "name" : "えりこ", "age" : 2 } ] }

オブジェクトの中を検索条件にする場合は”(ダブルクォーテーション)でくくる必要がありますのでご注意下さい。

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

# 要素数で検索
for doc in db1.col1.find({'skill': {'$size':3}}):
print(doc)

# 配列の中に指定した値をすべて持つかどうかを検索
for doc in db1.col1.find({'skill':{'$all':["Python", "Driving"]}}):
print(doc)

# オブジェクトの値で検索
for doc in db1.col1.find({'child.age':5}):
print(doc)

次回はソートと検索件数の制限を行ってみます。