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

Er det muligt at sortere, gruppere og begrænse effektivt i Mongo med en pipeline?

For at besvare dit første spørgsmål:$group gør ikke bevare ordenen. Der er åbne anmodninger om ændringer, som også fremhæver baggrunden lidt, men det ser ikke ud til, at produktet vil blive ændret for at bevare inputdokumenternes rækkefølge:

To ting kan siges generelt:Du vil generelt først gruppere og derefter foretage sorteringen. Årsagen er, at sortering af færre elementer (som grupperingen generelt producerer) vil være hurtigere end at sortere alle inputdokumenter.

For det andet vil MongoDB sørge for at sortere så effektivt og lidt som muligt. dokumentationen siger:

Så denne kode får jobbet gjort i dit tilfælde:

collection.aggregate({
    $group: {
        _id: '$age',
        names: { $push: '$name' }
    }
}, {
    $sort: { 
        '_id': 1 
    }
}, {
    $limit: 10
})

REDIGER efter dine kommentarer:

Jeg er enig i, hvad du siger. Og tager jeg din logik lidt længere, vil jeg gå så langt som at sige:Hvis $group var smart nok til at bruge et indeks, så skulle det ikke engang kræve en $sort etape i starten. Desværre er det ikke (endnu sandsynligvis). Som tingene ser ud i dag, $group vil aldrig bruge et indeks, og det vil ikke tage genveje baseret på følgende trin ($limit I dette tilfælde). Se også dette link hvor nogen kørte nogle grundlæggende tests.

Aggregeringsrammen er stadig ret ung, så jeg gætter på, at der bliver gjort meget arbejde for at gøre aggregeringspipelinen smartere og hurtigere.

Der er svar her på StackOverflow (f.eks. her ), hvor folk foreslår at bruge en forhåndskode $sort fase for at "tvinge" MongoDB til at bruge et indeks på en eller anden måde. Dette bremsede imidlertid mine tests (1 million registreringer af din prøveform ved brug af forskellige tilfældige fordelinger) betydeligt.

Når det kommer til ydeevnen af ​​en aggregeringspipeline, $match stadier i starten er det, der virkelig hjælper mest. Hvis du kan begrænse det samlede antal poster, der skal gå gennem pipelinen fra begyndelsen, så er det dit bedste bud - selvfølgelig...;)




  1. Hvordan kører jeg Redis på Windows 32 bit?

  2. mongodb aggregering med $project for at betinget udelukke et felt

  3. At forvandle et Mongoose seeding script til et løfte

  4. Introduktion til Apache HBase Snapshots