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átorZavedeno 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 mezi0
a1
. 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 }