首页 > 解决方案 > MongoDB $group + $project + 每周平均

问题描述

我试图在 Mongo 每周获得一些商店的平均水平,但它不起作用。你能帮我吗?

db.collection.aggregate(
[
    {$match:{storeId:{$in:[
ObjectId("e069d1b76557685b9e235v"),ObjectId("e069d1b76557685b9t7j8n"),
ObjectId("e069d1b76557685b9e2fg6"),ObjectId("e069d1b76557685b9p56r2") 
]}}},
{$group:{_id:"$storeId", week: { date: new Date("$createdAt")  }, totalPoints: {$sum: "$points"}, averagePoints: {$avg: "$points"}} },
    {$sort: {totalPoints:-1}}
])

它不起作用。但是,如果我删除了一周的部分时间,代码可以正常工作,但平均值错误

db.collection.aggregate(
[
    {$match:{storeId:{$in:[
ObjectId("e069d1b76557685b9e235v"),ObjectId("e069d1b76557685b9t7j8n"),
ObjectId("e069d1b76557685b9e2fg6"),ObjectId("e069d1b76557685b9p56r2") 
]}}},
{$group:{_id:"$storeId", totalPoints: {$sum: "$points"}, averagePoints: {$avg: "$points"}} },
    {$sort: {totalPoints:-1}}
])

标签: mongodbmongodb-query

解决方案


对于groupBy一周,您可以使用$weekmongo 的功能并在$match操作中添加开始日期。

db.collection.aggregate(
[
    {$match:{storeId:{$in:[
ObjectId("e069d1b76557685b9e235v"),ObjectId("e069d1b76557685b9t7j8n"),
ObjectId("e069d1b76557685b9e2fg6"),ObjectId("e069d1b76557685b9p56r2") 
]},
 timeStamp: {$gt: ISODate(createdAt)},
}},
{$group:{_id:"$storeId", week: { $week: '$timeStamp'}, totalPoints: {$sum: "$points"}, averagePoints: {$avg: "$points"}} },
    {$sort: {totalPoints:-1}}
])

推荐阅读