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