Om du behöver returnera ett litet urval av slumpmässiga dokument från en samling, här är tre metoder du kan prova med hjälp av aggregeringspipelinen.
$sample
Scen
$sample
aggregeringspipelinesteget är utformat specifikt för att slumpmässigt välja ett visst antal dokument.
När du använder $sample
anger du antalet dokument som du vill returnera i en size
fältet.
Anta att vi har följande samling som heter pets
:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "typ" :"Hund", "vikt" :10 }{ "_id" :3, "name" :"Mjau", "typ" :"Katt", "vikt" :7 }{ "_id" :4, "namn" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Bat", "weight" :3 }{ " _id" :6, "name" :"Hop", "type" :"Känguru", "vikt" :130 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :8, "name" :"Snap", "type" :"Crocodile", "weight" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "vikt" :1 }
Vi kan använda $sample
för att ta ett slumpmässigt urval av dessa dokument så här:
db.pets.aggregate( [ { $sample:{ size:3 } } ])
Resultat:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :5, "name" :"Bruce", "typ" :"Bat", "weight" :3 }{ "_id" :3, "name" :"Meow", "type" :"Cat", "weight" :7 }
I det här fallet angav jag { size: 3 }
som returnerade tre dokument.
Här använder den återigen en annan provstorlek:
db.pets.aggregate(
[
{
$sample: { size: 5 }
}
]
)
Resultat:
{ "_id" :6, "name" :"Hop", "type" :"Känguru", "vikt" :130 }{ "_id" :5, "name" :"Bruce", "typ" :"Bat", "weight" :3 }{ "_id" :8, "name" :"Snap", "type" :"Krokodil", "weight" :400 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }
$sample
scenen fungerar på ett av två sätt, beroende på hur många dokument som finns i samlingen, urvalsstorleken i förhållande till antalet dokument i samlingen och dess position i pipelinen. Se MongoDB$sample
för en förklaring av hur det fungerar.Det är också möjligt att
$sample
stadium kan returnera samma dokument mer än en gång i sin resultatuppsättning.
$rand
Operatör
$rand
operatorn introducerades i MongoDB 4.4.2, och dess syfte är att returnera ett slumpmässigt flytande mellan 0 och 1 varje gång den anropas.Därför kan vi använda det i
$match
steg tillsammans med andra operatörer, såsom$expr
och$lt
för att returnera ett slumpmässigt urval av dokument.Exempel:
db.pets.aggregate( [ { $match: { $expr: { $lt: [ 0.5, { $rand: {} } ] } } } ] )
Resultat:
{ "_id" :3, "name" :"Mjau", "type" :"Katt", "vikt" :7 }{ "_id" :4, "name" :"Scratch", "typ" :"Katt", "vikt" :8 }{ "_id" :6, "name" :"Hopp", "typ" :"Känguru", "vikt" :130 }{ "_id" :9, "namn" :"Flutter", "type" :"Hummingbird", "weight" :1 }Resultatuppsättningen från detta tillvägagångssätt skiljer sig från
$sample
tillvägagångssätt, eftersom det inte returnerar ett fast antal dokument. Antalet dokument som returneras med detta tillvägagångssätt kan variera.Det här är till exempel vad som händer när jag kör samma kod flera gånger till.
Resultatuppsättning 2:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :7, "name" :"Punch", "typ" :"Gorilla", "weight" :300 }{ "_id" :8, "name" :"Snap", "type" :"Krokodil", "weight" :400 }Resultatuppsättning 3:
{ "_id" :2, "name" :"Bark", "type" :"Hund", "weight" :10 }{ "_id" :4, "name" :"Scratch", "typ" :"Cat", "weight" :8 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 }Resultatuppsättning 4:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :3, "name" :"Mjau", "typ" :"Katt", "vikt" :7 }{ "_id" :6, "name" :"Hopp", "typ" :"Känguru", "vikt" :130 }{ "_id" :8, "namn" :"Snap", "type" :"Krokodil", "vikt" :400 }Resultatuppsättning 5:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :4, "name" :"Scratch", "typ" :"Cat", "weight" :8 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :8, "name" :"Snap", "type" :"Crocodile", "weight" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 }
$sampleRate
OperatörIntroducerad i MongoDB 4.4.2,
$sampleRate
operator ger ett mer kortfattat sätt att göra samma sak som i föregående exempel.När du använder
$sampleRate
, anger du en samplingsfrekvens som ett flyttal mellan0
och1
. Urvalsprocessen använder en enhetlig slumpmässig fördelning, och urvalsfrekvensen du anger representerar sannolikheten att ett visst dokument kommer att väljas när det passerar genom pipelinen.Exempel:
db.pets.aggregate( [ { $match: { $sampleRate: 0.5 } } ] )
Resultat:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "typ" :"Hund", "vikt" :10 }{ "_id" :5, "name" :"Bruce", "typ" :"Bat", "vikt" :3 }{ "_id" :6, "namn" :"Hop", "type" :"Känguru", "vikt" :130 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "vikt" :300 }{ " _id" :8, "name" :"Snap", "type" :"Krokodil", "vikt" :400 }Och kör det igen:
{ "_id" :3, "name" :"Mjau", "type" :"Katt", "vikt" :7 }{ "_id" :4, "name" :"Scratch", "typ" :"Cat", "weight" :8 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :8, "name" :"Snap", "type" :"Crocodile", "weight" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 }Och igen:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "typ" :"Hund", "vikt" :10 }{ "_id" :3, "name" :"Mjau", "typ" :"Katt", "vikt" :7 }{ "_id" :8, "namn" :"Snap", "type" :"Krokodil", "vikt" :400 }