Предположим, у нас есть 2 продавца A и B. Мы взяли набор данных, как показано ниже (при условии, что номер детали совпадает или вы также можете изменить его):
/* 1 createdAt:18/10/2019, 16:48:35*/
{
"_id" : ObjectId("5da99f8bd4ce6a7d8bebb442"),
"partNumber" : 1,
"seller" : "B",
"price" : 15,
"createdAt" : ISODate("2019-10-11T16:13:31.451+05:30")
},
/* 2 createdAt:18/10/2019, 16:48:35*/
{
"_id" : ObjectId("5da99f8bd4ce6a7d8bebb441"),
"partNumber" : 1,
"seller" : "A",
"price" : 1,
"createdAt" : ISODate("2019-10-11T16:13:31.451+05:30")
},
/* 3 createdAt:18/10/2019, 16:48:35*/
{
"_id" : ObjectId("5da99f8bd4ce6a7d8bebb440"),
"partNumber" : 1,
"seller" : "B",
"price" : 10,
"createdAt" : ISODate("2019-10-10T16:13:31.451+05:30")
},
/* 4 createdAt:18/10/2019, 16:48:35*/
{
"_id" : ObjectId("5da99f8bd4ce6a7d8bebb43f"),
"partNumber" : 1,
"seller" : "A",
"price" : 10,
"createdAt" : ISODate("2019-10-10T16:13:31.451+05:30")
},
/* 5 createdAt:18/10/2019, 16:48:35*/
{
"_id" : ObjectId("5da99f8bd4ce6a7d8bebb43e"),
"partNumber" : 1,
"seller" : "B",
"price" : 7,
"createdAt" : ISODate("2019-10-09T16:13:31.451+05:30")
},
/* 6 createdAt:18/10/2019, 16:48:35*/
{
"_id" : ObjectId("5da99f8bd4ce6a7d8bebb43d"),
"partNumber" : 1,
"seller" : "A",
"price" : 5,
"createdAt" : ISODate("2019-10-09T16:13:31.451+05:30")
}
Наш запрос будеткак показано ниже:
db.collection.aggregate([
{
$group: {
_id: { seller: "$seller", partNumber: "$partNumber" },
lastSalesPrice: { $last: "$price" },
firstSalesPrice: { $first: "$price" },
}
},
{
$project: {
seller: "$_id.seller",
partNumber: "$_id.partNumber",
lastSalesPrice: "$lastSalesPrice",
firstSalesPrice: "$firstSalesPrice",
diff: { $subtract: ["$lastSalesPrice", "$firstSalesPrice" ] }
}
},
{
$sort: { "diff": -1 }
}
])
Результат запроса выше будет следующим:
/* 1 */
{
"_id" : {
"seller" : "B",
"partNumber" : 1
},
"seller" : "B",
"partNumber" : 1,
"lastSalesPrice" : 15,
"firstSalesPrice" : 7,
"diff" : 8
},
/* 2 */
{
"_id" : {
"seller" : "A",
"partNumber" : 1
},
"seller" : "A",
"partNumber" : 1,
"lastSalesPrice" : 1,
"firstSalesPrice" : 5,
"diff" : -4
}