Reputation: 87
I have a pricing collection and i want to query the biggest price change over time depending on the seller and i have not clue how to accomplish this in a single query.
The collection includes
_id
partNumber
seller
price
createdAt
Every day for each product about 30 prices should get inserted, but in a real world that is not 100%...
so i was thinking about this.
Is that possible with mongodb aggregate or something else?
Upvotes: 1
Views: 47
Reputation: 3185
Let assume we have 2 sellers A and B. We have taken a set of data as below (assuming part Number are same or you can change it as well):
/* 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")
}
Our Query will be as below:
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 }
}
])
Result of above query will be as follow:
/* 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
}
Upvotes: 1