sql >> Databasteknik >  >> NoSQL >> MongoDB

3 sätt att returnera ett slumpmässigt urval av dokument från en MongoDB-samling

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ör

Introducerad 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 mellan 0 och 1 . 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 }

  1. Skapa flerfältsindex i Mongoose / MongoDB

  2. mongoexport utan _id-fält

  3. Vad är standardsessionens timeout och hur man konfigurerar det när du använder vårsessionen med Redis som backend

  4. Fråga Mongodb om månad, dag, år... för ett datum och tid