node.js - Mongodb 根据贡献度获取用户排名
问题描述
这是我的 mongodb 集合的粗略表示:
{
user: ID1,
type: 'redemption,
amount: 200
},
{
user: ID2,
type: 'redemption,
amount: 1000
},
{
user: ID1,
type: 'redemption',
amount: 300
},
{
user: ID3,
type: 'redemption',
amount: 3000
}
“类型”字段是可变的(赎回、转移等)。我正在努力寻找用户兑换最多积分的内容。在这种特殊情况下,ID3 是拥有 3000 点积分的最高兑换者,ID2 是第二名(1000),ID1 是第三名(300+200=500)。
我应该查看哪些 Mongo 操作?
ps 我快到了:
aggregate([
{
$group : {
_id : "$user",
redeemedTotal: { $sum: "$amount" }
}
}
])
但它 $sum不仅输入:'redemption',还输入其他类型的金额。我如何将其缩小到仅type: 'redemption'
pps 我想我明白了:
.aggregate([
{
$match: { "type": "redemption" }
},
{
$group : {
_id : "$sender",
redeemedTotal: { $sum: "$amount" }
}
}
])
解决方案
您需要使用$cond
运算符
db.collection.aggregate([
{
$group: {
_id: "$user",
redeemedTotal: {
$sum: {
$cond: [
{
$eq: ["$type", "redemption"]
},
"$amount", //true
0 //false
]
}
}
}
}
])
选择
Groupby 超过 1 个字段
db.collection.aggregate([
{
$group: {
_id: {
user: "$user",
type: "$type"
},
redeemedTotal: {
$sum: "$amount"
}
}
}
])
推荐阅读
- algorithm - 如何设计一种算法以(几乎)总是在 Kayles 游戏中获胜(正常游戏约定)
- python - 使用 PYTHON 计算多个 excel 文件中的行总和
- laravel - Laravel - 在中间件中删除 Cookie
- asp.net-core - 如何从 Razor 页面中的选择列表将变量路由到另一个页面
- graphql - CQRS 命令和 GraphQL 突变
- php - 教义实体验证是否足够?
- javascript - 如何将道具传递给vue Js中的样式对象
- java - 当进行手动 CRUD 操作时,可以通知/查看 Hibernate 吗?
- javascript - React 中的复选框管理
- python - 矩形未在屏幕上绘制