今回はソートと検索件数の制限を行います。
サンプルデータ
次のようなデータを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を組み合わせて検索
今回紹介したsort/limit/skipは、組み合わせて使用することができます。
例えば、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
client = MongoClient()
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)
for doc in db1.col1.find().limit(3): print(doc)
for doc in db1.col1.find().skip(2): print(doc)
for doc in db1.col1.find().sort('age', pymongo.ASCENDING).skip(1).limit(3): print(doc)
|
MongoDBの検索に関する動作確認は以上です。
次回からは、MongoDBの更新に関する動作を確認していきます。