sql >> Databáze >  >> NoSQL >> MongoDB

2 způsoby, jak omezit dokumenty vrácené v MongoDB

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)

  1. Co si mám vybrat:MongoDB/Cassandra/Redis/CouchDB?

  2. Jak migrovat data v MongoDB

  3. MongoCollection versus DBCollection java

  4. Hledání záznamů mongoDB v dávkách (pomocí adaptéru mongoid ruby)