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

sorter array i forespørgsel og projekter alle felter

Da du grupperer på dokumentet _id du kan blot placere de felter, du ønsker at beholde, i grupperingen _id . Derefter kan du omforme ved hjælp af $project

db.c.aggregate([
    { "$unwind": "$array_to_sort"},
    { "$sort": {"array_to_sort.b":1, "array_to_sort:a": 1}},
    { "$group": { 
        "_id": {
            "_id": "$_id",
            "unknown_field": "$unknown_field"
        },
        "Oarray_to_sort": { "$push":"$array_to_sort"}
    }},
    { "$project": {
        "_id": "$_id._id",
        "unknown_field": "$_id.unknown_field",
        "array_to_sort": "$Oarray_to_sort"
    }}
]);

Det andet "trick" derinde er at bruge et midlertidigt navn til arrayet i grupperingsstadiet. Dette er tilfældet, når du $projekt og ændre navnet, får du felterne i den rækkefølge, der er angivet i projektionssætningen. Hvis du ikke gjorde det, ville feltet "array_to_sort" ikke være det sidste felt i rækkefølgen, da det er kopieret fra det foregående trin.

Det er en tilsigtet optimering i $project , men hvis du vil have ordren så kan du gøre det som ovenfor.

For helt ukendte strukturer findes mapReduce måden at gøre tingene på:

db.c.mapReduce(
    function () {
        this["array_to_sort"].sort(function(a,b) {
            return a.a - b.a || a.b - b.b;
        });

        emit( this._id, this );
    },
    function(){},
    { "out": { "inline": 1 } }
)

Det har selvfølgelig et outputformat, der er specifikt for mapReduce og derfor ikke lige det dokument, du havde, men alle felterne er indeholdt under "værdier":

{
    "results" : [
            {
                    "_id" : 0,
                    "value" : {
                            "_id" : 0,
                            "some_field" : "a",
                            "array_to_sort" : [
                                    {
                                            "a" : 1,
                                            "b" : 0
                                    },
                                    {
                                            "a" : 3,
                                            "b" : 3
                                    },
                                    {
                                            "a" : 3,
                                            "b" : 4
                                    }
                            ]
                    }
            }
    ],
}

Fremtidige udgivelser (i skrivende stund) giver dig mulighed for at bruge en $$ROOT variabel i aggregeret for at repræsentere dokumentet:

db.c.aggregate([
    { "$project": {
        "_id": "$$ROOT",
        "array_to_sort": "$array_to_sort"
    }},
    { "$unwind": "$array_to_sort"},
    { "$sort": {"array_to_sort.b":1, "array_to_sort:a": 1}},
    { "$group": { 
        "_id": "$_id",
        "array_to_sort": { "$push":"$array_to_sort"}
    }}
]);

Så det nytter ikke at bruge det sidste "projekt"-stadium, da du faktisk ikke kender de andre felter i dokumentet. Men de vil alle være indeholdt (inklusive det originale array og rækkefølge ) i _id felt i resultatdokumentet.




  1. MongoDB - installationsfejl - mongodb opsætningsguide sluttede for tidligt

  2. Hvordan kører man hukommelsesanalyse på AWS ElastiCache?

  3. Befolk indlejret array i mongoose

  4. Fejlfinding af problemer