クエリを実行する場合MongoDBでは、返されるドキュメントを制限するオプションがあります。ここで、操作によって返されるドキュメントの最大数を指定します。
たとえば、操作で通常2,000のドキュメントが返されるが、1,000の制限を指定した場合、1,000のドキュメントのみが返されます。ただし、操作で500ドキュメントのみが返される場合は、500ドキュメントすべてが返されます(1,000ドキュメントの制限に違反していないため)。
これは、TOP
を使用するのと少し似ています SQL Serverの句、またはLIMIT
MySQL、MariaDB、PostgreSQL、およびSQLiteの句。
返されるドキュメントを制限すると、必要以上に多くのドキュメントが返され、処理されるのを防ぐことができるため、パフォーマンスを向上させることができます。
MongoDBでは、cursor.limit()
を使用できます メソッドまたは$limit
返されるドキュメントを制限するための集計演算子。
cursor.limit()
方法
pets
というコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 } { "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 }
limit()
を使用できます このコレクションをクエリするときに返されるドキュメントの数を制限するメソッド。
例:
db.pets.find().limit(3)
結果:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
$limit
集約演算子
集計パイプラインを使用する場合は、$limit
を使用できます パイプラインの次のステージに渡される結果を制限するための集計演算子。
例:
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
}
])
例:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
通常、$match
オペレーターは、ここにあるような空のドキュメントで構成されていません。通常、パイプラインのその部分で結果をフィルタリングするためのクエリが含まれます。ただし、この場合、例をわかりやすくするために空のドキュメントを使用しました。
最初の段階で空のドキュメントを渡したとすると、これを実行できたはずです。
db.pets.aggregate([
{
$limit : 3
}
])
いずれにせよ、結果は3つのドキュメントに限定されていました。
集計パイプラインで使用する場合、$limit
オペレーターはパイプラインの途中にいる可能性があります。もしそうなら、それは限られた文書を次の段階に渡します。
これが私が何を意味するかを説明するための例です。
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
},
{
$match: { "type": "Cat" }
}
])
結果:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
(元のドキュメントには2匹の猫がいますが)限られた結果には1匹の猫しかいなかったので、その猫だけが第3段階で一致しました。
これは、次のことを行うこととは異なります。
db.pets.aggregate([
{
$match: { "type": "Cat" }
},
{
$limit : 3
}
])
結果:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
この場合、元のドキュメントで猫を検索し、結果を3つに制限しました。猫が2匹しかない場合、$limit
結果に影響はありませんでした。
並べ替えられたドキュメントの制限
ドキュメントの並べ替え後に結果を制限すると、制限によって並べ替えが考慮されます。
例:
db.pets.aggregate([
{
$sort: { "_id": -1 }
},
{
$limit : 3
}
])
結果:
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
この場合、すべてのドキュメントを_id
で並べ替えました 降順のフィールド(-1
降順を指定します。
ここでも昇順です(1
の値) 昇順を指定します):
db.pets.aggregate([
{
$sort: { "_id": 1 }
},
{
$limit : 3
}
])
結果:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
明示的に並べ替えた後で結果を制限する場合は、並べ替え操作で安定した並べ替えを使用していることを確認してください。
安定ソート 実行されるたびに同じソート順を返すものです。 不安定な並べ替え 一方、複数回実行すると異なるソート順を返す可能性があるものです。
安定した並べ替えを確実に実行するには、一意の値のみを含む少なくとも1つのフィールドを並べ替えに含めます(たとえば、_id
フィールド)。
詳細情報
詳細については、MongoDBのドキュメントを参照してください:
-
cursor.limit()
-
$limit
(集計)