MongoDB(13) - 検索編(ソート)

今回はソートと検索件数の制限を行います。

サンプルデータ

次のようなデータを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
25
26
27
28
29
30
31
32
33
34
35
36
> db.col1.insertOne({name:'高山', age:20})
{
"acknowledged" : true,
"insertedId" : ObjectId("6125c3fc15504c166c7ec86f")
}

> db.col1.insertOne({name:'生田', age:11})
{
"acknowledged" : true,
"insertedId" : ObjectId("6125c3fc15504c166c7ec870")
}

> db.col1.insertOne({name:'菅井', age:34})
{
"acknowledged" : true,
"insertedId" : ObjectId("6125c3fc15504c166c7ec871")
}

> db.col1.insertOne({name:'武本', age:58})
{
"acknowledged" : true,
"insertedId" : ObjectId("6125c3fc15504c166c7ec872")
}

> db.col1.insertOne({name:'上村', age:41})
{
"acknowledged" : true,
"insertedId" : ObjectId("6125c3fc15504c166c7ec873")
}

> db.col1.find()
{ "_id" : ObjectId("6125c3fc15504c166c7ec86f"), "name" : "高山", "age" : 20 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec870"), "name" : "生田", "age" : 11 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec871"), "name" : "菅井", "age" : 34 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec872"), "name" : "武本", "age" : 58 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec873"), "name" : "上村", "age" : 41 }

ソート

検索結果をソートするためには、sortを使います。

sortの引数にソートするキーと昇順・降順を指定します。

[Mongoシェル]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1:昇順ソート
> db.col1.find().sort({age:1})
{ "_id" : ObjectId("6125c3fc15504c166c7ec870"), "name" : "生田", "age" : 11 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec86f"), "name" : "高山", "age" : 20 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec871"), "name" : "菅井", "age" : 34 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec873"), "name" : "上村", "age" : 41 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec872"), "name" : "武本", "age" : 58 }

# -1:降順ソート
> db.col1.find().sort({age:-1})
{ "_id" : ObjectId("6125c3fc15504c166c7ec872"), "name" : "武本", "age" : 58 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec873"), "name" : "上村", "age" : 41 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec871"), "name" : "菅井", "age" : 34 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec86f"), "name" : "高山", "age" : 20 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec870"), "name" : "生田", "age" : 11 }

件数制限

検索結果が多すぎると、結果がなかなか返ってこないということがあります。

そのような場合は、limitを使って取得する件数を制限します。

[Mongoシェル]

1
2
3
4
5
# 3件だけ取得
> db.col1.find().limit(3)
{ "_id" : ObjectId("6125c3fc15504c166c7ec86f"), "name" : "高山", "age" : 20 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec870"), "name" : "生田", "age" : 11 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec871"), "name" : "菅井", "age" : 34 }

取得開始位置を指定

ページング処理をする場合、検索結果の11番目から20番目だけを取得したいということがありまs。

skipを使うと、取得の開始位置を指定することができます。

1番目のドキュメントの場合は0,2番目のドキュメントを指定する場合は1を指定します。
(0からのカウントになるので注意してください。)

[Mongoシェル]

1
2
3
4
5
# 検索結果の3番目以降を取得
> db.col1.find().skip(2)
{ "_id" : ObjectId("6125c3fc15504c166c7ec871"), "name" : "菅井", "age" : 34 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec872"), "name" : "武本", "age" : 58 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec873"), "name" : "上村", "age" : 41 }

sort / limit / skipを組み合わせて検索

今回紹介したsortlimitskipは、組み合わせて使用することができます。

例えば、ageで昇順ソートし検索結果の2番目から3件取得する場合は次のようになります。

[Mongoシェル]

1
2
3
4
> db.col1.find().sort({age:1}).skip(1).limit(3)
{ "_id" : ObjectId("6125c3fc15504c166c7ec86f"), "name" : "高山", "age" : 20 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec871"), "name" : "菅井", "age" : 34 }
{ "_id" : ObjectId("6125c3fc15504c166c7ec873"), "name" : "上村", "age" : 41 }

Pythonで操作

上記の検索をPythonで行うと、次のようになります。

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import pymongo
from pymongo import MongoClient

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

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

# 昇順ソート
for doc in db1.col1.find().sort('age', pymongo.ASCENDING):
print(doc)

# 降順ソート
for doc in db1.col1.find().sort('age', pymongo.DESCENDING):
print(doc)

# 3件だけ取得
for doc in db1.col1.find().limit(3):
print(doc)

# 検索結果の3番目以降を取得
for doc in db1.col1.find().skip(2):
print(doc)

# ageで昇順ソートし検索結果の2番目から3件取得
for doc in db1.col1.find().sort('age', pymongo.ASCENDING).skip(1).limit(3):
print(doc)

MongoDBの検索に関する動作確認は以上です。

次回からは、MongoDBの更新に関する動作を確認していきます。