sql >> Database teknologi >  >> NoSQL >> MongoDB

3 måder at returnere en tilfældig prøve af dokumenter fra en MongoDB-samling

Hvis du har brug for at returnere en lille prøve af tilfældige dokumenter fra en samling, er her tre metoder, du kan prøve ved at bruge aggregeringspipelinen.

$sample Etape

$sample aggregeringspipeline-stadiet er designet specifikt til tilfældigt at vælge et bestemt antal dokumenter.

Når du bruger $sample , angiver du antallet af dokumenter, du gerne vil returnere i en size felt.

Antag, at vi har følgende samling kaldet pets :

{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Hund", "vægt" :10 }{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }{ "_id" :4, "navn" :"Scratch", "type" :"Kat", "vægt" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Flagermus", "vægt" :3 }{ " _id" :6, "name" :"Hop", "type" :"Kænguru", "vægt" :130 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :8, "name" :"Snap", "type" :"Krokodille", "vægt" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Kolibri", "vægt" :1 }

Vi kan bruge $sample for at tage et tilfældigt udsnit af disse dokumenter som dette:

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

Resultat:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "vægt" :20 }{ "_id" :5, "name" :"Bruce", "type" :"Flagermus", "vægt" :3 }{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }

I dette tilfælde specificerede jeg { size: 3 } som returnerede tre dokumenter.

Her bruger den igen en anden prøvestørrelse:

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

Resultat:

{ "_id" :6, "name" :"Hop", "type" :"Kænguru", "vægt" :130 }{ "_id" :5, "name" :"Bruce", "type" :"Flagermus", "vægt" :3 }{ "_id" :8, "name" :"Snap", "type" :"Krokodille", "vægt" :400 }{ "_id" :7, "navn" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 } 

$sample fase fungerer på en af ​​to måder, afhængigt af hvor mange dokumenter der er i samlingen, stikprøvestørrelsen i forhold til antallet af dokumenter i samlingen og dens placering i pipelinen. Se MongoDB $sample for en forklaring på, hvordan det virker.

Det er også muligt, at $sample fase kunne returnere det samme dokument mere end én gang i sit resultatsæt.

$rand Operatør

$rand operator blev introduceret i MongoDB 4.4.2, og dens formål er at returnere en tilfældig float mellem 0 og 1, hver gang den kaldes.

Derfor kan vi bruge det i $match fase sammen med andre operatører, såsom $expr og $lt for at returnere en tilfældig stikprøve af dokumenter.

Eksempel:

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

Resultat:

{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Kat", "vægt" :8 }{ "_id" :6, "name" :"Hop", "type" :"Kænguru", "vægt" :130 }{ "_id" :9, "navn" :"Flutter", "type" :"Kolibri", "vægt" :1 }

Resultatsættet fra denne tilgang er anderledes end $sample tilgang, idet den ikke returnerer et fast antal dokumenter. Antallet af dokumenter, der returneres med denne tilgang, kan variere.

For eksempel, her er hvad der sker, når jeg kører den samme kode flere gange.

Resultatsæt 2:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "vægt" :300 }{ "_id" :8, "name" :"Snap", "type" :"Krokodille", "vægt" :400 }

Resultatsæt 3:

{ "_id" :2, "name" :"Bark", "type" :"Hund", "vægt" :10 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 }

Resultatsæt 4:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "vægt" :20 }{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }{ "_id" :6, "name" :"Hop", "type" :"Kænguru", "vægt" :130 }{ "_id" :8, "navn" :"Snap", "type" :"Krokodille", "vægt" :400 }

Resultatsæt 5:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "vægt" :20 }{ "_id" :4, "name" :"Scratch", "type" :"Kat", "vægt" :8 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "vægt" :300 }{ "_id" :8, "navn" :"Snap", "type" :"Crocodile", "weight" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 } 

$sampleRate Operatør

Introduceret i MongoDB 4.4.2, $sampleRate operator giver en mere kortfattet måde at gøre det samme på som i det foregående eksempel.

Når du bruger $sampleRate , angiver du en sample rate som et flydende kommatal mellem 0 og 1 . Udvælgelsesprocessen bruger en ensartet tilfældig fordeling, og den stikprøvefrekvens, du angiver, repræsenterer sandsynligheden for, at et givet dokument vil blive udvalgt, når det passerer gennem pipelinen.

Eksempel:

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

Resultat:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Hund", "vægt" :10 }{ "_id" :5, "name" :"Bruce", "type" :"Flagermus", "vægt" :3 }{ "_id" :6, "navn" :"Hop", "type" :"Kænguru", "vægt" :130 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "vægt" :300 }{ " _id" :8, "name" :"Snap", "type" :"Krokodille", "vægt" :400 }

Og kør det igen:

{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Kat", "vægt" :8 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "vægt" :300 }{ "_id" :8, "navn" :"Snap", "type" :"Crocodile", "weight" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 } 

Og igen:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Hund", "vægt" :10 }{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }{ "_id" :8, "navn" :"Snap", "type" :"Krokodille", "vægt" :400 }

  1. Brug jedis hvordan man skriver til en specifik slot/node i redis cluster

  2. Hvordan opdaterer man, hvis der findes, ellers indsæt nyt dokument?

  3. Argumenter, der sendes ind, skal være en enkelt streng på 12 bytes

  4. Spark Structured Streaming dynamisk opslag med Redis