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

Dynamiske nøgler efter $gruppe efter

Ikke at jeg synes, det er en god idé, og mest fordi jeg slet ikke kan se nogen "aggregering" her er, at efter "gruppering" for at føje til et array, så $push alt det indhold i array af "status" grupperingsnøgle og derefter konvertere til nøgler til et dokument i en $replaceRoot med $arrayToObject :

db.collection.aggregate([
  { "$group": {
    "_id": "$status",
    "data": { "$push": "$$ROOT" }
  }},
  { "$group": {
    "_id": null,
    "data": {
      "$push": {
        "k": "$_id",
        "v": "$data"
      }
    }
  }},
  { "$replaceRoot": {
    "newRoot": { "$arrayToObject": "$data" }
  }}
])

Returnerer:

{
        "inProgress" : [
                {
                        "_id" : ObjectId("5b18d31a27a37696ec8b5776"),
                        "status" : "inProgress",
                        "description" : "inProgress..."
                }
        ],
        "completed" : [
                {
                        "_id" : ObjectId("5b18d31a27a37696ec8b5773"),
                        "status" : "completed",
                        "description" : "completed..."
                }
        ],
        "pending" : [
                {
                        "_id" : ObjectId("5b18d14cbc83fd271b6a157c"),
                        "status" : "pending",
                        "description" : "You have to complete the challenge..."
                },
                {
                        "_id" : ObjectId("5b18d31a27a37696ec8b5775"),
                        "status" : "pending",
                        "description" : "pending..."
                }
        ]
}

Det kan være okay HVIS du faktisk "aggregeret" på forhånd, men på enhver praktisk størrelse samling er alt, hvad der gør, at prøve at tvinge hele samlingen ind i et enkelt dokument, og det vil sandsynligvis bryde BSON-grænsen på 16 MB, så jeg vil bare ikke anbefale at prøve dette uden " gruppering" noget andet før dette trin.

Helt ærligt, den samme følgende kode gør det samme, og uden aggregeringstricks og ingen BSON-begrænsningsproblem:

var obj = {};

// Using forEach as a premise for representing "any" cursor iteration form
db.collection.find().forEach(d => {
  if (!obj.hasOwnProperty(d.status))
    obj[d.status] = [];
  obj[d.status].push(d);
})

printjson(obj);

Eller lidt kortere:

var obj = {};

// Using forEach as a premise for representing "any" cursor iteration form
db.collection.find().forEach(d => 
  obj[d.status] = [ 
    ...(obj.hasOwnProperty(d.status)) ? obj[d.status] : [],
    d
  ]
)

printjson(obj);

Aggregeringer bruges til "datareduktion", og alt, der blot "omformer resultater" uden faktisk at reducere de data, der returneres fra serveren, håndteres normalt bedre i klientkoden alligevel. Du returnerer stadig alle data, uanset hvad du gør, og klientbehandlingen af ​​markøren har betydeligt mindre overhead. Og INGEN begrænsninger.




  1. Django Selleri få opgavetælling

  2. Installation af Apache CouchDB på Debian 9

  3. _http_server.js:192 throw new RangeError(`Ugyldig statuskode:${statusCode}`);

  4. opslag i mongodb aggregering