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

cuente el campo del subdocumento y la cantidad total en mongodb

La canalización de agregación MongoDB está disponible para resolver su problema. Obtiene detalles de una matriz de mi procesamiento con $unwind y luego usando $group para "sumar" los totales:

db.collection.aggregate([
    // Unwind the array to de-normalize as documents
    { "$unwind": "$details" },

    // Group on the key you want and provide other values
    { "$group": { 
        "_id": "$details.itemcode",
        "itemname": { "$first": "$details.itemname" },
        "totalprice": { "$sum": "$details.price" },
        "totalqty": { "$sum": "$details.qty" }
    }}
])

Idealmente, desea un $match etapa allí para filtrar cualquier dato irrelevante primero. Esta es básicamente una consulta MongoDB y toma todos los mismos argumentos y operadores.

La mayoría aquí es realmente simple. El $unwind es algo así como un "JOIN" en SQL, excepto que en una estructura incrustada, la "unión" ya está hecha, por lo que simplemente está "desnormalizando" como lo haría una unión entre las relaciones de tabla "uno a muchos" pero solo dentro del documento mismo. Básicamente, "repite" las partes del documento "principal" en la matriz para cada miembro de la matriz como un nuevo documento.

Entonces el $group obras de una clave, como en "GROUP BY", donde la "clave" es el _id valor. Todo allí es "distinto" y todos los demás valores se recopilan mediante "operadores de agrupación".

Aquí es donde operaciones como $first entrar. Como se describe en la página del manual, esto toma el "primer" valor del "límite de agrupación" mencionado en la "clave" anterior. Desea esto porque es "probable" que todos los valores de este campo sean iguales, por lo que esta es una opción lógica para elegir simplemente la "primera" coincidencia.

Finalmente está el $sum operador de agrupación que hace lo que se debe esperar. Todos los valores proporcionados bajo la "clave" se "suman" o "suman" para obtener un total. Al igual que SQL SUM() .

También tenga en cuenta que todos los $ nombres prefijados así es como el marco de agregación trata con variables para nombres de "campo/propiedad" dentro del documento actual que se está procesando. "Notación de puntos" se utiliza para hacer referencia a los "campos/propiedades" incrustados anidados dentro de un nombre de propiedad principal.

Es útil aprender la agregación en MongoDB. Es para consultas generales lo que cualquier cosa más allá de una instrucción "SELECCIONAR" básica es para SQL. No solo para "agrupar", sino también para otras manipulaciones.

Lea la documentación de todos los operadores de agregación y también eche un vistazo a SQL to Aggregation Mapping en la documentación como guía general si está familiarizado con SQL para empezar. Ayuda a explicar conceptos y muestra algunas cosas que se pueden hacer.