sql >> Databáze >  >> NoSQL >> MongoDB

Dynamické klíče po $group by

Ne že bych si myslel, že je to dobrý nápad a hlavně proto, že zde nevidím vůbec žádnou "agregaci", je to, že po "seskupení" pro přidání do pole podobně $push veškerý tento obsah do pole pomocí "status" seskupovací klíč a poté převést na klíče dokumentu v $replaceRoot pomocí $arrayToObject :

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

Vrátí:

{
        "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..."
                }
        ]
}

To by mohlo být v pořádku KDYŽ ve skutečnosti jste "agregovali" předem, ale na jakékoli prakticky velké sbírce se vše, co děláte, snaží vnutit celou sbírku do jediného dokumentu, a to pravděpodobně poruší limit BSON 16 MB, takže bych to nedoporučoval ani zkoušet bez " seskupení“ něco jiného před tímto krokem.

Upřímně řečeno, stejný následující kód dělá to samé a bez triků s agregací a bez problému s limitem BSON:

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);

Nebo trochu kratší:

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);

Agregace se používají pro „snížení dat“ a cokoli, co jednoduše „přetváří výsledky“, aniž by ve skutečnosti redukovalo data vrácená ze serveru, je stejně obvykle lépe zpracováno v klientském kódu. Stále vracíte všechna data bez ohledu na to, co děláte, a klientské zpracování kurzoru má podstatně menší režii. A ŽÁDNÁ omezení.




  1. Návrh schématu MongoDB:Vždy existuje schéma

  2. Jak nakonfigurovat MongoDB Java ovladač MongoOptions pro produkční použití?

  3. Správa připojení

  4. Import CSV pomocí schématu Mongoose