sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man får tillbaka originaldokumentet efter aggregering

Faller under kategorin dumma sammanställningsknep är en liten teknik som ofta blir förbisedd.

Frågan som gör allt är att gruppera runt dokumentet _id, som är den unika identifieraren för detta dokument. Så den viktigaste punkten att tänka på är hela dokumentet är faktiskt redan en unik identifierare. Så istället för att bara gömma in _id-nyckeln, använd hela dokumentet.

    {$project: { 
        _id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
    },

När detta görs behåller allt som rullas upp av _id dokumentet i sin ursprungliga form. I slutet av alla andra aggregeringsstadier, utfärda ett sista $project för att återställa det verkliga originaldokumentet:

    {$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}

Då får du de filtrerade resultaten du vill ha. Den här tekniken kan vara mycket praktisk när den används med avancerad filtrering, till exempel i fallet med den här frågan, eftersom den tar bort behovet av att göra ytterligare sök på alla resultat.

I ett sådant fall där du vet att du bara letar efter en uppsättning resultat som kommer att matcha en viss uppsättning villkor, använd en $match operatör som första steget i aggregationspipelinen. Detta är inte bara användbart för att minska storleken på arbetsuppsättningen, utan det är också det enda skede där du kan använda ett index och där du avsevärt kan öka frågeprestanda.

Hela processen tillsammans:

db.forms.aggregate([
    {$match: { "forms.status": "closed" } },
    {$project: { 
        _id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
    },
    {$unwind: "$forms"},
    {$group: { _id: "$_id", status: {$addToSet: "$forms.status"}}},
    {$unwind: "$status"},
    {$sort: { _id: 1, status: -1} },
    {$group: { _id: "$_id", status: {$first: "$status"} }},
    {$match: { status: "closed"}},
    {$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}
])



  1. Hur kör jag Redis på Windows 32 bit?

  2. Push Operations i MongoDB

  3. Implementering av paginering i mongodb

  4. Fel:queryTxt ETIMEOUT vid anslutning till MongoDb Atlas med mongoose