MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

compter le champ du sous-document et le montant total dans mongodb

Le pipeline d'agrégation de MongoDB est disponible pour résoudre votre problème. Vous obtenez les détails d'un tableau que je traite avec $unwind puis en utilisant $group pour "additionner" les totaux :

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" }
    }}
])

Idéalement, vous voulez un $match étape là-dedans pour filtrer d'abord toutes les données non pertinentes. Il s'agit essentiellement d'une requête MongoDB et prend tous les mêmes arguments et opérateurs.

La plupart ici est vraiment simple. Le $unwind est un peu comme une "JOINTURE" en SQL sauf que dans une structure intégrée la "jointure" est déjà faite, donc vous "dénormalisez" juste comme une jointure le ferait entre les relations de table "un à plusieurs" mais juste dans le documenter lui-même. En gros, il "répète" les parties du document "parent" dans le tableau pour chaque membre du tableau en tant que nouveau document.

Puis le $group fonctionne d'une clé, comme dans "GROUP BY", où la "clé" est le _id évaluer. Tout y est "distinct" et toutes les autres valeurs sont rassemblées par des "opérateurs de regroupement".

C'est là que des opérations comme $first entrez. Comme décrit sur la page de manuel, cela prend la "première" valeur de la "limite de regroupement" mentionnée dans la "clé" plus tôt. Vous voulez cela parce que toutes les valeurs de ce champ sont "susceptibles" d'être les mêmes, c'est donc un choix logique de choisir simplement la "première" correspondance.

Enfin, il y a le $sum opérateur de regroupement qui fait ce qui devrait être attendu. Toutes les valeurs fournies sous la "clé" sont "additionnées" ou "additionnées" ensemble pour fournir un total. Tout comme SQL SUM() .

Notez également que tous les $ noms préfixés, il y a la façon dont le cadre d'agrégation traite les variables pour les noms de "champ/propriété" dans le document en cours de traitement. "Notation par points" est utilisé pour référencer les "champs/propriétés" imbriqués dans un nom de propriété parent.

Il est utile d'apprendre l'agrégation dans MongoDB. C'est aux requêtes générales ce que n'importe quoi au-delà d'une instruction "SELECT" de base est à SQL. Pas seulement pour le "regroupement", mais aussi pour d'autres manipulations.

Lisez la documentation de tous les opérateurs d'agrégation et jetez également un coup d'œil à SQL to Aggregation Mapping dans la documentation comme guide général si vous avez une certaine familiarité avec SQL pour commencer. Il aide à expliquer les concepts et montre certaines choses qui peuvent être faites.