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

afficher la somme de tous les fichiers récupérés dans le pilote mongodb-nodejs

Vous pouvez le faire avec le pipeline d'agrégation. Voici le code exporté pour Node :


    [
      {
        '$match': {
          '$or': [
            {
              'orderCreatedForDate': new Date('Fri, 31 Jan 2020 05:00:00 GMT')
            }, {
              'orderCreatedForDate': new Date('Fri, 24 Jan 2020 05:00:00 GMT')
            }
          ]
        }
      }, {
        '$unwind': {
          'path': '$totalOrder', 
          'includeArrayIndex': 'string'
        }
      }, {
        '$group': {
          '_id': {
            'productCode': '$totalOrder.productCode', 
            'date': '$orderCreatedForDate'
          }, 
          'tradeCopies': {
            '$sum': '$totalOrder.tradeCopies'
          }, 
          'subscriptionCopies': {
            '$sum': '$totalOrder.subscriptionCopies'
          }, 
          'freeCopies': {
            '$sum': '$totalOrder.freeCopies'
          }, 
          'institutionalCopies': {
            '$sum': '$totalOrder.institutionalCopies'
          }, 
          'productCode': {
            '$last': '$totalOrder.productCode'
          }, 
          'publicationName': {
            '$last': '$totalOrder.publicationName'
          }, 
          'editionName': {
            '$last': '$totalOrder.editionName'
          }, 
          'publicationDate': {
            '$last': '$orderCreatedForDate'
          }
        }
      }, {
        '$sort': {
          'publicationDate': 1
        }
      }, {
        '$group': {
          '_id': '$_id.productCode', 
          'tradeCopies': {
            '$last': '$tradeCopies'
          }, 
          'previousTradeCopies': {
            '$first': '$tradeCopies'
          }, 
          'subscriptionCopies': {
            '$last': '$subscriptionCopies'
          }, 
          'previousSubscriptionCopies': {
            '$first': '$subscriptionCopies'
          }, 
          'institutionalCopies': {
            '$last': '$institutionalCopies'
          }, 
          'previousInstitutionalCopies': {
            '$first': '$institutionalCopies'
          }, 
          'freeCopies': {
            '$last': '$freeCopies'
          }, 
          'previousFreeCopies': {
            '$first': '$freeCopies'
          }, 
          'productCode': {
            '$last': '$productCode'
          }, 
          'publicationName': {
            '$last': '$publicationName'
          }, 
          'editionName': {
            '$last': '$editionName'
          }, 
          'publicationDate': {
            '$last': '$publicationDate'
          }
        }
      }, {
        '$project': {
          'productCode': 1, 
          'publicationName': 1, 
          'editionName': 1, 
          'publicationDate': 1, 
          'tradeCopies': 1, 
          'subscriptionCopies': 1, 
          'institutionalCopies': 1, 
          'freeCopies': 1, 
          'previousWeekCopies': [
            {
              'tradeCopies': '$previousTradeCopies', 
              'subscriptionCopies': '$previousSubscriptionCopies', 
              'freeCopies': '$previousFreeCopies', 
              'institutionalCopies': '$previousInstitutionalCopies'
            }
          ]
        }
      }
    ]

Voyons ce qui se passe à chaque étape :


    [{$match: {
      $or: [ {orderCreatedForDate: ISODate('2020-01-31T05:00:00.000+00:00')},
      {orderCreatedForDate: ISODate('2020-01-24T05:00:00.000+00:00')}]
    }}, 

Nous commençons par faire correspondre les commandes dont les dates nous intéressent.

    {$unwind: {
      path: "$totalOrder",
      includeArrayIndex: 'string'
    }}, 

Ensuite, nous déroulons le tableau totalOrder. Cela crée un document pour chaque commande.


    {$group: {
      _id: {productCode: "$totalOrder.productCode", date: "$orderCreatedForDate"},
      tradeCopies: {
        $sum: "$totalOrder.tradeCopies"
      },
      subscriptionCopies: {
        $sum: "$totalOrder.subscriptionCopies"
      },
      freeCopies: {
        $sum: "$totalOrder.freeCopies"
      },
      institutionalCopies: {
        $sum: "$totalOrder.institutionalCopies"
      },
      productCode: { $last: "$totalOrder.productCode"},
      publicationName: { $last: "$totalOrder.publicationName"},
      editionName: { $last: "$totalOrder.editionName"},
      publicationDate: { $last: "$orderCreatedForDate"}
    }}, 

Ensuite, nous regroupons les documents par code produit et par date. Cela nous permet de générer les sommes dont nous avons besoin.


    {$sort: {
      publicationDate: 1
    }}, 

Ensuite, nous trions nos documents afin que nous sachions que les documents les plus anciens sont les premiers.


    {$group: {
      _id: "$_id.productCode",
      tradeCopies: {
        $last: "$tradeCopies"
      },
      previousTradeCopies: {
        $first: "$tradeCopies"
      },
      subscriptionCopies: {
        $last: "$subscriptionCopies"
      },
      previousSubscriptionCopies: {
        $first: "$subscriptionCopies"
      },
      institutionalCopies: {
        $last: "$institutionalCopies"
      },
      previousInstitutionalCopies: {
        $first: "$institutionalCopies"
      },
      freeCopies: {
        $last: "$freeCopies"
      },
      previousFreeCopies: {
        $first: "$freeCopies"
      },
      productCode: { $last: "$productCode"},
      publicationName: { $last: "$publicationName"},
      editionName: { $last: "$editionName"},
      publicationDate: { $last: "$publicationDate"}
    }}, 

Ensuite, nous regroupons nos documents par code produit afin de pouvoir créer un document unique pour chaque code produit.


    {$project: {
      productCode: 1,
      publicationName: 1,
      editionName: 1,
      publicationDate: 1,
      tradeCopies: 1,
      subscriptionCopies: 1,
      institutionalCopies: 1,
      freeCopies: 1,
      previousWeekCopies: [{
        tradeCopies: "$previousTradeCopies",
        subscriptionCopies: "$previousSubscriptionCopies",
        freeCopies: "$previousFreeCopies",
        institutionalCopies: "$previousInstitutionalCopies"
      }
        ]
    }}]

Enfin, nous projetons les champs dont nous avons besoin dans le format dont nous avons besoin.

Voici quelques captures d'écran pour que vous puissiez voir visuellement ce qui se passe à chaque étape.

Pour en savoir plus sur l'utilisation du pipeline d'agrégation avec Node.js, consultez https://www.mongodb.com/blog/post/quick-start-nodejs--mongodb--how-to-analyze-data- utilisation-du-cadre-d-agrégation . Je recommande également fortement le cours gratuit de MongoDB University sur le pipeline d'agrégation :https://university.mongodb. com/courses/M121/about