mongodb - 在 mongoDB 集合中查询、投影和排序文档的多个字段
问题描述
我有一个简单的 mongoDB 集合,名为 usersCollection,它的一般结构是这样的:
[
{
"username" : "john",
"sex" : "m",
"email" : "john@gmail.com",
"courses" : [
{
"title" : "medicine",
"grade": 25,
},
{
"title" : "art",
"grade": 29,
},
{
"title" : "history",
"grade": 21,
}
]
},
{
"username" : "jane",
"sex" : "f",
"email" : "jane@gmail.com",
"courses" : [
{
"title" : "math",
"grade": 20,
},
{
"title" : "medicine",
"grade": 30,
}
]
},
{
"username" : "sarah",
"sex" : "f",
"email" : "sarah@gmail.com",
"courses" : [ ]
},
{
"username" : "josh",
"sex" : "f",
"email" : "josh@gmail.com",
"courses" : [
{
"title" : "english",
"grade": 28,
}
]
},
{
"username" : "mark",
"sex" : "m",
"email" : "mark@gmail.com",
"courses" : [
{
"title" : "history",
"grade": 30,
},
{
"title" : "medicine",
"grade": 19,
},
{
"title" : "math",
"grade": 22,
}
]
}
]
每个用户都是 usersCollection 的成员,并且有一些一般信息和他/她已经完成的相关课程的列表。
谁能告诉我如何查询 usersCollection 以获取包含已完成特定课程的所有用户的对象的降序排序数组?该数组的每个对象都应包含相关用户的“姓名”、“电子邮件”和“等级”。
例如,在名为“medicine”的课程周围对 usersCollection 发起查询,我将获得以下数组:
[
{
"username": "jane",
"email": "jane@gmail.com",
"grade": 30
},
{
"username": "john",
"email": "john@gmail.com",
"grade": 25
},
{
"username": "mark",
"email": "mark@gmail.com",
"grade": 19
}
]
解决方案
您可以使用 mongoDB 的排序和分组管道来管理它。如果您想获得任何特定的课程,您可以在排序管道之前应用匹配管道。
db.users.aggregate([
{
$unwind: "$courses"
},
{
$match: {
'courses.title': 'medicine'
}
},
{
$sort: {
'courses.title': -1,
'courses.grade': -1,
}
},
{
$group: {
_id: "$courses.title",
records: {
$push: {
"_id" : "$_id",
"username" : "$username",
"sex" : "$sex",
"email" : "$email",
"grade":"$courses.grade"
}
}
}
}
])
推荐阅读
- node.js - AWS Lambda Node Js - 如果存在则增加值,否则添加元素
- javascript - 动态更改 SAP Fiori 标题时“this.getService 不是函数”
- javascript - 如何使用 vanilla JavaScript 从任何网站读取元素?
- php - 在主页上爆炸wp帖子标题
- javascript - IIFE 以不同的结果运行函数声明和函数表达式
- mysql - 主键 varchar mysql
- javascript - 计算数组中平方数之和的 For 循环
- qt - 如何创建仅包含 QML 文件的共享库
- typescript - 为什么在打字稿中为通用 setter 属性设置值不会更新另一个属性的值?
- c# - api调用不会用邮递员触发