MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Klucze dynamiczne po $grupuj według

Nie uważam, że to dobry pomysł, a głównie dlatego, że w ogóle nie widzę tu żadnej „agregacji”, jest to, że po „grupowaniu”, aby dodać do tablicy podobnie $push cała ta zawartość do tablicy według "status" klucz grupujący, a następnie konwertuj na klucze dokumentu w $replaceRoot z $arrayToObject :

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

Zwroty:

{
        "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 może być w porządku JEŚLI faktycznie "zagregowałeś" wcześniej, ale na każdej praktycznie wielkości kolekcji wszystko, co robi, to próba wymuszenia całej kolekcji w jednym dokumencie, a to prawdopodobnie przekroczy limit BSON wynoszący 16 MB, więc po prostu nie polecam nawet próbować tego bez " grupowanie” czegoś innego przed tym krokiem.

Szczerze mówiąc, ten sam poniższy kod robi to samo, bez sztuczek agregacji i bez problemu z 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);

Lub trochę krócej:

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

Agregacje są używane do „redukcji danych”, a wszystko, co po prostu „przekształca wyniki” bez faktycznej redukcji danych zwracanych z serwera, jest zwykle lepiej obsługiwane w kodzie klienta. Wciąż zwracasz wszystkie dane bez względu na to, co robisz, a przetwarzanie kursora przez klienta ma znacznie mniejsze obciążenie. I ŻADNYCH ograniczeń.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose Unikalne wartości w zagnieżdżonej tablicy obiektów

  2. Najlepsze oprogramowanie pośredniczące do przechowywania sesji dla Express + MongoDB

  3. MongoDB C# Query dla „Lubię to” w ciągu znaków

  4. Przewodnik programisty po zestawach replik MongoDB

  5. MongoDB $round vs $trunc:Jaka jest różnica?