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

3 způsoby, jak vrátit náhodný vzorek dokumentů ze sbírky MongoDB

Pokud potřebujete vrátit malý vzorek náhodných dokumentů z kolekce, zde jsou tři přístupy, které můžete vyzkoušet pomocí agregačního kanálu.

$sample Fáze

$sample agregační kanál je navržen speciálně pro náhodný výběr určitého počtu dokumentů.

Když použijete $sample , určíte počet dokumentů, které chcete vrátit v size pole.

Předpokládejme, že máme následující kolekci nazvanou pets :

{ "_id" :1, "name" :"Wag", "type" :"Pes", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Pes", "váha" :10 }{ "_id" :3, "jméno" :"Mňau", "typ" :"Kočka", "váha" :7 }{ "_id" :4, "jméno" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Bat", "weight" :3 }{ " _id" :6, "name" :"Hop", "type" :"Klokánek", "váha" :130 }{ "_id" :7, "name" :"Punch", "type" :"Gorila", "váha" :300 }{ "_id" :8, "name" :"Snap", "type" :"Krokodýl", "váha" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Kolibřík", "váha" :1 }

Můžeme použít $sample získat náhodný vzorek těchto dokumentů, jako je tento:

db.pets.aggregate( [ { $sample:{ size:3 } } ])

Výsledek:

{ "_id" :1, "name" :"Wag", "type" :"Pes", "weight" :20 }{ "_id" :5, "name" :"Bruce", "type" :"Netopýr", "váha" :3 }{ "_id" :3, "jméno" :"Mňau", "typ" :"Kočka", "váha" :7 }

V tomto případě jsem zadal { size: 3 } který vrátil tři dokumenty.

Zde opět používá jinou velikost vzorku:

db.pets.aggregate(
   [
      { 
        $sample: { size: 5 } 
      }
   ]
) 

Výsledek:

{ "_id" :6, "name" :"Hop", "type" :"Klokánek", "váha" :130 }{ "_id" :5, "name" :"Bruce", "type" :"Bat", "weight" :3 }{ "_id" :8, "name" :"Snap", "type" :"Krokodýl", "váha" :400 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :4, "name" :"Scratch", "type" :"Kočka", "váha" :8 } 

$sample stage funguje jedním ze dvou způsobů, v závislosti na počtu dokumentů ve sbírce, velikosti vzorku vzhledem k počtu dokumentů ve sbírce a její pozici ve sbírce. Viz MongoDB $sample pro vysvětlení, jak to funguje.

Je také možné, že $sample stage může vrátit stejný dokument více než jednou ve své výsledné sadě.

$rand Operátor

$rand Operátor byl představen v MongoDB 4.4.2 a jeho účelem je vrátit náhodný float mezi 0 a 1 pokaždé, když je zavolán.

Proto jej můžeme použít v $match fázi ve spojení s dalšími operátory, jako je $expr a $lt vrátit náhodný vzorek dokumentů.

Příklad:

db.pets.aggregate(
   [
      { 
        $match: 
          { 
            $expr: 
              { 
                $lt: [ 0.5, { $rand: {} } ] 
              }
          } 
      }
   ]
) 

Výsledek:

{ "_id" :3, "name" :"Mňau", "type" :"Kočka", "váha" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Kočka", "váha" :8 }{ "_id" :6, "jméno" :"Hop", "typ" :"Klokánek", "váha" :130 }{ "_id" :9, "jméno" :"Flutter", "type" :"Kolibřík", "váha" :1 }

Výsledná sada z tohoto přístupu se liší od $sample přístup, kdy nevrací pevný počet dokumentů. Počet dokumentů vrácených tímto přístupem se může lišit.

Zde je například uvedeno, co se stane, když stejný kód spustím ještě několikrát.

Sada výsledků 2:

{ "_id" :1, "name" :"Wag", "type" :"Pes", "weight" :20 }{ "_id" :7, "name" :"Punch", "type" :"Gorila", "váha" :300 }{ "_id" :8, "jméno" :"Snap", "type" :"Krokodýl", "váha" :400 }

Sada výsledků 3:

{ "_id" :2, "name" :"Štěkání", "type" :"Pes", "váha" :10 }{ "_id" :4, "name" :"Scratch", "type" :"Kočka", "váha" :8 }{ "_id" :9, "jméno" :"Flutter", "type" :"Kolibřík", "váha" :1 }

Sada výsledků 4:

{ "_id" :1, "name" :"Wag", "type" :"Pes", "weight" :20 }{ "_id" :3, "name" :"Mňau", "type" :"Kočka", "váha" :7 }{ "_id" :6, "jméno" :"Hop", "typ" :"Klokánek", "váha" :130 }{ "_id" :8, "jméno" :"Snap", "type" :"Krokodýl", "váha" :400 }

Sada výsledků 5:

{ "_id" :1, "name" :"Wag", "type" :"Pes", "weight" :20 }{ "_id" :4, "name" :"Scratch", "type" :"Kočka", "váha" :8 }{ "_id" :7, "jméno" :"Punch", "typ" :"Gorila", "váha" :300 }{ "_id" :8, "jméno" :"Snap", "type" :"Krokodýl", "váha" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Kolibřík", "váha" :1 } 

$sampleRate Operátor

Zavedeno v MongoDB 4.4.2, $sampleRate operátor poskytuje stručnější způsob, jak udělat totéž, co předchozí příklad.

Když použijete $sampleRate , zadáte vzorkovací frekvenci jako číslo s plovoucí desetinnou čárkou mezi 0 a 1 . Proces výběru používá jednotné náhodné rozdělení a vámi poskytnutá vzorkovací frekvence představuje pravděpodobnost, že daný dokument bude vybrán, když prochází kanálem.

Příklad:

db.pets.aggregate(
   [
      { 
        $match: { $sampleRate: 0.5 } 
      }
   ]
) 

Výsledek:

{ "_id" :1, "name" :"Wag", "type" :"Pes", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Pes", "váha" :10 }{ "_id" :5, "jméno" :"Bruce", "typ" :"Netopýr", "váha" :3 }{ "_id" :6, "jméno" :"Hop", "type" :"Klokánek", "váha" :130 }{ "_id" :7, "name" :"Punch", "type" :"Gorila", "váha" :300 }{ " _id" :8, "name" :"Snap", "type" :"Krokodýl", "váha" :400 }

A spusťte to znovu:

{ "_id" :3, "name" :"Mňau", "type" :"Kočka", "váha" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Kočka", "váha" :8 }{ "_id" :7, "jméno" :"Punch", "typ" :"Gorila", "váha" :300 }{ "_id" :8, "jméno" :"Snap", "type" :"Krokodýl", "váha" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Kolibřík", "váha" :1 } 

A znovu:

{ "_id" :1, "name" :"Wag", "type" :"Pes", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Pes", "váha" :10 }{ "_id" :3, "jméno" :"Mňau", "typ" :"Kočka", "váha" :7 }{ "_id" :8, "jméno" :"Snap", "type" :"Krokodýl", "váha" :400 }

  1. Převést MongoDB BsonDocument na platný JSON v C#

  2. Jak vypustit databázi v MongoDB z příkazového řádku

  3. Agregát Mongodb:převeďte datum na jiné časové pásmo

  4. uložit IP adresu do mongoDB