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

ordinamento dei documenti secondari mangusta

Avrei potuto scriverlo come poche cose, ma in considerazione di "recuperare gli oggetti della mangusta" sembra essere la considerazione principale.

Quindi ci sono varie cose che "potresti" fare. Ma dal momento che stai "popolando i riferimenti" in un oggetto e poi vuoi modificare l'ordine degli oggetti in un array, c'è davvero un solo modo per risolvere questo problema una volta per tutte.

Correggi i dati nell'ordine in cui li crei

Se vuoi che la tua matrice "commenti" sia ordinata in base alla data in cui sono "create_at", questo si suddivide anche in molteplici possibilità:

  1. "Dovrebbe" essere stato aggiunto nell'ordine di "inserimento", quindi "l'ultimo" è l'ultimo come si nota, ma puoi anche "modificarlo" nelle versioni recenti (da un paio d'anni) di MongoDB con $position come modificatore di $push :

    Article.update(
        { "_id": articleId },
        { 
            "$push": { "comments": { "$each": [newComment], "$position": 0 } }
        },
        function(err,result) {
            // other work in here
        }
    );
    

    Questo "antepone" l'elemento dell'array all'array esistente al "primo" (0) indice in modo che sia sempre in primo piano.

  2. Non riuscendo a utilizzare gli aggiornamenti "posizionali" per ragioni logiche o semplicemente per dove "vuoi essere sicuro", c'è stato per un tempo ancora "più lungo" il $sort modificatore in $push :

    Article.update(
        { "_id": articleId },
        { 
            "$push": { 
                "comments": { 
                    "$each": [newComment], 
                    "$sort": { "$created_at": -1 } 
                }
            }
        },
        function(err,result) {
            // other work in here
        }
    );
    

    E questo "ordinerà" sulla proprietà dei documenti degli elementi dell'array che contiene il valore specificato su ogni modifica. Puoi anche fare:

    Article.update(
        {  },
        { 
            "$push": { 
                "comments": { 
                    "$each": [], 
                    "$sort": { "$created_at": -1 } 
                }
            }
        },
        { "multi": true },
        function(err,result) {
            // other work in here
        }
    );
    

    E questo ordinerà ogni array di "commenti" nell'intera raccolta in base al campo specificato in un colpo.

Altre soluzioni sono possibili usando .aggregate() per ordinare l'array e/o il "recasting" in oggetti mangusta dopo aver eseguito quell'operazione o dopo aver eseguito il proprio .sort() sull'oggetto semplice.

Entrambi implicano davvero la creazione di un oggetto modello separato e di uno "schema" con gli elementi incorporati, comprese le informazioni "riferite". Quindi potresti lavorare su quelle linee, ma sembra non essere un sovraccarico quando potresti semplicemente ordinare i dati a te "più necessario" significa in primo luogo.

L'alternativa è assicurarsi che campi come "virtuali" vengano sempre "serializzati" in un formato oggetto con .toObject() su chiamata e vivi con il fatto che tutti i metodi ora sono spariti e funzionano con le proprietà come presentate.

L'ultimo è un approccio "sano", ma se quello che usi in genere è l'ordine "created_at", allora ha molto più senso "memorizzare" i tuoi dati in quel modo con ogni operazione, quindi quando li "recuperi", rimane nel ordine che intendi utilizzare.