Když spouštíte dotazy v MongoDB, máte možnost omezit vracené dokumenty. Zde zadáte maximální počet dokumentů, které má operace vrátit.
Pokud by například operace normálně vrátila 2 000 dokumentů, ale zadáte limit 1 000, vrátí se pouze 1 000 dokumentů. Pokud by však operace vrátila pouze řekněme 500 dokumentů, pak se vrátí všech 500 (protože nepřekračují limit 1 000 dokumentů).
Je to trochu jako použití TOP
klauzule v SQL Server nebo LIMIT
klauzule v MySQL, MariaDB, PostgreSQL a SQLite.
Omezení vracených dokumentů může pomoci zlepšit výkon tím, že zabrání tomu, aby bylo vráceno a zpracováno více dokumentů, než je nutné.
V MongoDB můžeme použít cursor.limit()
nebo $limit
agregačního operátora k omezení vracených dokumentů.
cursor.limit()
Metoda
Předpokládejme, že máme sbírku nazvanou pets
s následujícími dokumenty:
{ "_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 }
Můžeme použít limit()
metoda k omezení počtu dokumentů vrácených při dotazování této kolekce.
Příklad:
db.pets.find().limit(3)
Výsledek:
{ "_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
Operátor agregace
Při použití agregačního kanálu můžete použít $limit
operátor agregace, aby omezil výsledky předávané do další fáze procesu.
Příklad:
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
}
])
Příklad:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Obvykle $match
operátor by se neskládal z prázdného dokumentu, jaký máme zde. Normálně by zahrnoval dotaz, pomocí kterého se filtrují výsledky v této části kanálu. Ale v tomto případě jsem použil prázdný dokument, abych usnadnil následování příkladu.
Vzhledem k tomu, že jsem v první fázi prošel prázdným dokumentem, mohl jsem udělat toto:
db.pets.aggregate([
{
$limit : 3
}
])
V každém případě byl výsledek omezen na pouhé 3 dokumenty.
Při použití v agregačním kanálu $limit
operátor by mohl být někde uprostřed potrubí. Pokud ano, předá omezené dokumenty do další fáze.
Zde je příklad pro ilustraci toho, co mám na mysli.
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
},
{
$match: { "type": "Cat" }
}
])
Výsledek:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Pouze jedna kočka byla v omezených výsledcích (i když v původním dokumentu jsou dvě kočky), takže pouze tato kočka byla spárována ve třetí fázi.
To se liší od následujícího.
db.pets.aggregate([
{
$match: { "type": "Cat" }
},
{
$limit : 3
}
])
Výsledek:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
V tomto případě jsme hledali kočky v původním dokumentu a poté jsme omezili výsledky na pouhé 3. Vzhledem k tomu, že existují pouze 2 kočky, $limit
nemělo žádný vliv na výsledek.
Omezení setříděných dokumentů
Pokud omezíte výsledky po seřazení dokumentů, pak limit zohlední řazení.
Příklad:
db.pets.aggregate([
{
$sort: { "_id": -1 }
},
{
$limit : 3
}
])
Výsledek:
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
V tomto případě jsem všechny dokumenty seřadil podle jejich _id
pole v sestupném pořadí (-1
určuje sestupné pořadí).
Zde je opět ve vzestupném pořadí (hodnota 1
určuje vzestupné pořadí):
db.pets.aggregate([
{
$sort: { "_id": 1 }
},
{
$limit : 3
}
])
Výsledek:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Při omezování výsledků poté, co byly explicitně seřazeny, se ujistěte, že operace řazení používala stabilní řazení.
Stabilní řazení je taková, která vrací stejné pořadí řazení pokaždé, když je provedena. Nestabilní řazení na druhé straně je takový, který může vrátit jiné pořadí řazení, když se provádí vícekrát.
Chcete-li zajistit, že provádíte stabilní řazení, zahrňte do řazení alespoň jedno pole, které obsahuje výhradně jedinečné hodnoty (například _id
pole).
Další informace
Další informace najdete v dokumentaci MongoDB pro:
cursor.limit()
$limit
(agregace)