sql >> Database teknologi >  >> NoSQL >> MongoDB

viser summen af ​​alle de hentede filer i mongodb-nodejs driver

Du kan gøre dette med aggregeringspipelinen. Her er koden eksporteret til 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'
            }
          ]
        }
      }
    ]
 

Lad os tage et kig på, hvad der sker i hver fase:

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

Vi starter med at matche for ordrer, der har de datoer, vi holder af.

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

Så afvikler vi det samlede Ordre-array. Dette opretter et dokument for hver ordre.

{$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"} }},

Derefter grupperer vi dokumenterne efter produktkode og dato. Dette giver os mulighed for at generere de beløb, vi har brug for.


    {$sort: {
      publicationDate: 1
    }}, 

 

Så sorterer vi vores dokumenter, så vi ved, at de ældre dokumenter er først.


    {$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"}
    }}, 

 

Dernæst grupperer vi vores dokumenter efter produktkode, så vi kan oprette et enkelt dokument for hver produktkode.

{$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" } ] }}]

Til sidst projicerer vi de felter, vi har brug for, i det format, vi har brug for dem.

Her er nogle skærmbilleder, så du visuelt kan se, hvad der sker i hver fase.

For mere om, hvordan du bruger aggregeringspipelinen med Node.js, se https://www.mongodb.com/blog/post/quick-start-nodejs--mongodb--how-to-analyze-data- ved hjælp af-sammenlægningsrammen . Jeg anbefaler også varmt MongoDB Universitys gratis kursus om aggregeringspipeline:https://university.mongodb. com/courses/M121/about




  1. Kombiner to Redis-instanser til en enkelt instans med to dbs

  2. Hvorfor vil mine refs ikke udfylde dokumenter?

  3. mongoose document.save virker ikke

  4. Hvordan konstrueres forespørgsel til opdatering af indlejret array-dokument i mongo?