Можете да направите това с тръбопровода за агрегиране. Ето кода, експортиран за 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"}
}},
След това групираме нашите документи заедно по продуктов код, така че да можем да създадем един документ за всеки продуктов код.
{$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