Sie können dies mit der Aggregationspipeline tun. Hier ist der Code, der für Node:
exportiert wurde
[
{
'$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'
}
]
}
}
]
Sehen wir uns an, was in den einzelnen Phasen passiert:
[{$match: {
$or: [ {orderCreatedForDate: ISODate('2020-01-31T05:00:00.000+00:00')},
{orderCreatedForDate: ISODate('2020-01-24T05:00:00.000+00:00')}]
}},
Wir beginnen mit dem Matching für Bestellungen, die die Daten haben, die uns wichtig sind.
{$unwind: {
path: "$totalOrder",
includeArrayIndex: 'string'
}},
Dann wickeln wir das totalOrder-Array ab. Dadurch wird für jede Bestellung ein Dokument erstellt.
{$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"}
}},
Dann gruppieren wir die Dokumente nach Produktcode und Datum. Dadurch können wir die Summen generieren, die wir brauchen.
{$sort: {
publicationDate: 1
}},
Dann sortieren wir unsere Dokumente, damit wir wissen, dass die älteren Dokumente zuerst kommen.
{$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"}
}},
Als nächstes gruppieren wir unsere Dokumente nach Produktcode, sodass wir ein einzelnes Dokument für jeden Produktcode erstellen können.
{$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"
}
]
}}]
Schließlich projizieren wir die benötigten Felder in dem Format, in dem wir sie benötigen.
Hier sind einige Screenshots, damit Sie visuell sehen können, was in jeder Phase passiert
Weitere Informationen zur Verwendung der Aggregationspipeline mit Node.js finden Sie unter https://www.mongodb.com/blog/post/quick-start-nodejs--mongodb--how-to-analyze-data- Verwendung des Aggregationsframeworks . Ich empfehle auch den kostenlosen Kurs der MongoDB University zur Aggregationspipeline:https://university.mongodb. com/courses/M121/about