U kunt dit doen met de aggregatiepijplijn. Hier is de code die is geëxporteerd voor 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'
}
]
}
}
]
Laten we eens kijken wat er in elke fase gebeurt:
[{$match: {
$or: [ {orderCreatedForDate: ISODate('2020-01-31T05:00:00.000+00:00')},
{orderCreatedForDate: ISODate('2020-01-24T05:00:00.000+00:00')}]
}},
We beginnen met het matchen van bestellingen met de datums waar we om geven.
{$unwind: {
path: "$totalOrder",
includeArrayIndex: 'string'
}},
Vervolgens wikkelen we de array totalOrder af. Dit creëert een document voor elke bestelling.
{$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"}
}},
Vervolgens groeperen we de documenten op productcode en datum. Dit stelt ons in staat om de bedragen te genereren die we nodig hebben.
{$sort: {
publicationDate: 1
}},
Vervolgens sorteren we onze documenten, zodat we weten dat de oudere documenten eerst komen.
{$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"}
}},
Vervolgens groeperen we onze documenten op productcode, zodat we voor elke productcode één document kunnen maken.
{$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"
}
]
}}]
Ten slotte projecteren we de velden die we nodig hebben in het formaat dat we nodig hebben.
Hier zijn enkele screenshots zodat je visueel kunt zien wat er in elke fase gebeurt.
Voor meer informatie over het gebruik van de aggregatiepijplijn met Node.js, zie https://www.mongodb.com/blog/post/quick-start-nodejs--mongodb--how-to-analyze-data- het-aggregatieraamwerk gebruiken . Ik raad ook ten zeerste de gratis cursus van MongoDB University over de aggregatiepijplijn aan:https://university.mongoDB. com/courses/M121/about