O pipeline de agregação do MongoDB está disponível para resolver o seu problema. Você obtém detalhes de um array meu processamento com
$unwind
e, em seguida, usando $group
para "somar" os totais: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, você quer um
$match
estágio lá para filtrar todos os dados irrelevantes primeiro. Esta é basicamente uma consulta MongoDB e recebe todos os mesmos argumentos e operadores. A maioria aqui é realmente simples. O
$unwind
é como um "JOIN" no SQL, exceto que em uma estrutura incorporada o "join" já foi feito, então você está apenas "desnormalizando" como uma junção faria entre relacionamentos de tabela "um para muitos", mas apenas dentro do próprio documento. Ele basicamente "repete" as partes do documento "pai" para a matriz para cada membro da matriz como um novo documento. Em seguida, o
$group
funciona de uma chave, como em "GROUP BY", onde a "chave" é o _id
valor. Tudo lá é "distinto" e todos os outros valores são reunidos por "operadores de agrupamento". É aqui que operações como
$first
entrar. Conforme descrito na página de manual, isso pega o valor "primeiro" do "limite de agrupamento" mencionado na "chave" anterior. Você quer isso porque todos os valores deste campo são "prováveis" de serem os mesmos, então esta é uma escolha lógica para apenas escolher a "primeira" correspondência. Finalmente, há o
$sum
operador de agrupamento que faz o que deve ser esperado. Todos os valores fornecidos sob a "chave" são "adicionados" ou "somados" para fornecer um total. Assim como SQL SUM()
. Observe também que todos os
$
nomes prefixados é como a estrutura de agregação lida com variáveis para nomes de "campo/propriedade" dentro do documento atual que está sendo processado. "Notação de ponto"
é usado para fazer referência aos "campos/propriedades" incorporados aninhados em um nome de propriedade pai. É útil aprender agregação no MongoDB. É para consultas gerais o que qualquer coisa além de uma instrução "SELECT" básica é para SQL. Não apenas para "agrupamento", mas também para outras manipulações.
Leia a documentação de todos os operadores de agregação e também dê uma olhada em um SQL para mapeamento de agregação na documentação como um guia geral se você tiver alguma familiaridade com SQL para começar. Ajuda a explicar conceitos e mostra algumas coisas que podem ser feitas.