mongodb - 有没有办法给 MongoDB 聚合的结果提供 order 字段?
问题描述
有没有办法给 MongoDB 聚合结果排序或排名?
我的结果是:
{
"score":100
"name": "John"
},
{
"score":80
"name": "Jane"
},
{
"score":60
"name": "Lee"
}
我想要的结果是:
{
"score":100
"name": "John",
"rank": 1
},
{
"score":80
"name": "Jane"
"rank": 2
},
{
"score":60
"name": "Lee"
"rank": 3
}
我知道有一个叫做运算符$includeArrayIndex
,但这仅适用于$unwind
运算符。有没有办法在不使用的情况下给出排名$unwind
?
使用$unwind
需要对我的收藏进行分组,我担心分组管道太大而无法处理。
解决方案
另一种方法是$map
使用它的索引在文档中使用和添加排名,不要使用$unwind
阶段,因为它是单字段数组,您可以使用它的键名直接访问,如最后一行代码中提到的,
$group
通过 null 并在数组中创建文档root
数组,$map
迭代数组循环,root
使用从根数组获取当前对象的索引$indexOfArray
并使用返回的索引号递增,$add
因为索引从 0 开始,这就是我们创建rank
字段的方式,使用当前元素对象和rank
字段合并对象$mergeObjects
let result = await db.collection.aggregate([
{
$group: {
_id: null,
root: {
$push: "$$ROOT"
}
}
},
{
$project: {
_id: 0,
root: {
$map: {
input: "$root",
in: {
$mergeObjects: [
"$$this",
{
rank: { $add: [{ $indexOfArray: ["$root", "$$this"] }, 1] }
}
]
}
}
}
}
}
]);
// you can access result using root key
let finalResult = result[0]['root'];
推荐阅读
- octobercms - Get input value plugin octobercms backend
- json - 使用过滤器通过多个复选框获取值
- linux - 根据单元格值将 CSV 行拆分为多行
- node.js - Uploading an image file with Express.js, React, and MySQL
- mysql - 在上传和导入非常大的数据文件(CSV)时在所有列中添加“
- django - 加载没有 PrimaryKeyRelatedField 的相关主键加载时间过长
- jakarta-ee - 关于 2018/2019 年 WildFly 版本使用情况的可靠 2018 年统计研究/报告
- c# - 面临在 C# 中执行字符串操作的问题
- error-handling - 如何使用问号运算符来处理 Tokio 期货中的错误?
- php - 如何在 PHP 中安排电子邮件活动?