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 }