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

Cómo ordenar una matriz en una colección

Asumiendo los artículos en sus products array son únicos, no hay ningún soporte sencillo del lado del servidor para mantener este array ordenado como en MongoDB 2.4. Su mejor opción dadas las matrices anidadas será ordenar las matrices en la lógica de su aplicación según corresponda (es decir, al insertar/actualizar, o al recuperar/mostrar).

Consideraciones de modelado de datos

Si necesita manipular mucho las entradas de matrices anidadas, debería considerar aplanar su modelo de datos para que sea más fácil trabajar con él. Su objetivo de diseño con MongoDB debe ser tener un modelo de datos que sea apropiado para los casos de uso de su aplicación con un equilibrio de rendimiento aceptable entre la facilidad de inserción/actualización/consulta. Definitivamente no tiene que modelar todo en una sola colección/consulta si no tiene sentido hacerlo, y debe estar preparado para desnormalizar (duplicar) los datos. Para una relación de muchos a muchos, como productos <=> categorías, es típico incrustar y desnormalizar cualquier entidad que se actualice con menos frecuencia (por ejemplo, incrustar categorías en productos).

Matrices persistentes ordenadas y limitadas (elementos no únicos)

Si desea conservar matrices ordenadas y los elementos no son únicos, MongoDB 2.4 tiene la opción de $push a una matriz ordenada, pero esto debe usarse junto con un segmento (límite de matriz). Si $push entradas idénticas a una matriz ordenada, terminará con duplicados (por lo que es probable que esto no sea lo que está buscando).

Ejemplo de actualización, asumiendo page en su ejemplo fue el nombre de la colección:

db.page.update(
    // Query
    { "_id": "56rgt46rt54h68rt4h6" },

    // Update sorted array
    // NB: referring by array index position 0, as there isn't a named reference
    { $push : {
        "categories.0.products" : { 

            // List of new elements to push
            $each : [
                { "name" : "E", "pos": 3 }
            ],

            // Sort by pos (ascending)
            $sort : { "pos" : 1 },

            // Maximum number of array elements (required for $sort)
            $slice : -100
        }
    }}
)