sql >> Base de Datos >  >> NoSQL >> MongoDB

clasificación de subdocumentos mangosta

Podría haber escrito esto como algunas cosas, pero la consideración de "recuperar los objetos de mangosta" parece ser la consideración principal.

Así que hay varias cosas que "podrías" hacer. Pero dado que está "rellenando referencias" en un objeto y luego quiere alterar el orden de los objetos en una matriz, solo hay una forma de solucionar esto de una vez por todas.

Arregla los datos en orden a medida que los creas

Si desea que su matriz de "comentarios" se ordene por la fecha en que se "crearon_en", esto incluso se divide en múltiples posibilidades:

  1. Se "debería" haber agregado en el orden de "inserción", por lo que el "último" es el último como observa, pero también puede "modificar" esto en versiones recientes (últimos años) de MongoDB con $position como modificador de $push :

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

    Esto "antepone" el elemento de la matriz a la matriz existente en el índice "primero" (0) para que siempre esté al frente.

  2. Si no se usan las actualizaciones "posicionales" por razones lógicas o simplemente cuando "quiere estar seguro", ha existido durante un tiempo aún "más largo" el $sort modificador a $push :

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

    Y eso "ordenará" según la propiedad de los documentos de elementos de matriz que contienen el valor especificado en cada modificación. Incluso puedes hacer:

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

    Y eso ordenará cada matriz de "comentarios" en toda su colección por el campo especificado de un solo golpe.

Son posibles otras soluciones utilizando .aggregate() para ordenar la matriz y/o "re-fundir" a los objetos de mangosta después de haber realizado esa operación o después de hacer su propio .sort() en el objeto simple.

Ambos realmente implican la creación de un objeto de modelo separado y un "esquema" con los elementos incrustados que incluyen la información "referenciada". Por lo tanto, podría trabajar en esas líneas, pero parece ser una sobrecarga innecesaria cuando, en primer lugar, podría clasificar los datos según los medios "más necesarios".

La alternativa es asegurarse de que los campos como "virtuales" siempre se "serialicen" en un formato de objeto con .toObject() de guardia y vivir con el hecho de que todos los métodos se han ido ahora y trabajar con las propiedades tal como se presentan.

El último es un enfoque "cuerdo", pero si lo que normalmente usa es el orden "creado_en", entonces tiene mucho más sentido "almacenar" sus datos de esa manera con cada operación para que cuando los "recupere", permanezcan en el orden que va a utilizar.