我有一个价格集合,我想查询随时间变化的最大价格变化,这取决于卖方,我不知道如何在单个查询中完成此操作。
该收藏包括
_id
partNumber
seller
price
createdAt
每个产品每天大约插入30个价格,但在现实世界中并非100%...
所以我在考虑这个。
mongodb聚合或其他方式可能吗?
假设我们有两个卖方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
}