sql >> データベース >  >> NoSQL >> MongoDB

mongodb-nodejsドライバーにフェッチされたすべてのファイルの合計を表示します

    これは、集約パイプラインを使用して実行できます。 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'
                }
              ]
            }
          }
        ]
    

    各段階で何が起こっているかを見てみましょう:

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

    まず、気になる日付の注文を照合します。

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

    次に、totalOrder配列を巻き戻します。これにより、注文ごとにドキュメントが作成されます。

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

    次に、ドキュメントを製品コードごとにグループ化して、製品コードごとに1つのドキュメントを作成できるようにします。

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

    最後に、必要なフィールドを必要な形式で投影します。

    各段階で何が起こっているかを視覚的に確認できるように、いくつかのスクリーンショットを次に示します。

    Node.jsで集計パイプラインを使用する方法の詳細については、 https://www.mongodb.com/blog/post/quick-start-nodejs--mongodb--how-to-analyze-data-集約フレームワークの使用 。また、集約パイプラインに関するMongoDB大学の無料コースを強くお勧めします:https://university.mongodb。 com / courses / M121 / about




    1. Mongodb java:汎用フィールドを持つPeristPOJOクラス

    2. JSONからデータMongodbを復元する

    3. MongoDB:ユーザーをコメントに埋め込む

    4. 'MongoMappingContext#setAutoIndexCreation(boolean)'を使用するか、' MongoConfigurationSupport#autoIndexCreation()'をオーバーライドして明示的にしてください