这是我的数据模型
[
{
"_id": "5f7753db63cce11af6a7146e",
"completedExams": [
{
"_id": "5f778650cbc02f43e25064e0",
"createdAt": "2020-10-02T19:58:08.146Z",
"exam": "Test-1",
"score": 2
},
{
"_id": "5f77868ccbc02f43e25064e2",
"createdAt": "2020-10-02T19:59:08.493Z",
"exam": "Test-2",
"score": 1
}
]
}
]
我尝试过
User.findOne({"_id": "5f7753db63cce11af6a7146e"}).sort({'completedExams.createdAt': -1}).select({'completedExms.createdAt': 1, 'completedExams.score': 1, 'completedExams.exam': 1});
我从那个查询中得到这个
[
{
"_id": "5f7753db63cce11af6a7146e",
"completedExams": [
{
"createdAt": "2020-10-02T19:58:08.146Z",
"exam": "Test-1",
"score": 2
},
{
"createdAt": "2020-10-02T19:59:08.493Z",
"exam": "Test-2",
"score": 1
}
]
}
]
但是我想对它进行排序
[
{
"createdAt": "2020-10-02T19:59:08.493Z",
"exam": "Test-2",
"score": 1
},
{
"createdAt": "2020-10-02T19:58:08.146Z",
"exam": "Test-1",
"score": 2
}
]
答案 0 :(得分:0)
尝试一下:
db.User.aggregate([
{ $match: { _id: ObjectId("5f7753db63cce11af6a7146e") } },
{ $unwind: "$completedExams" },
{ $sort: { "completedExams.createdAt": -1 } },
{ $replaceRoot: { newRoot: "$completedExams" } }
])
对于这些功能,您必须使用聚合框架,即findOne
不起作用。
但是许多操作也接受聚合管道作为输入参数。
答案 1 :(得分:0)
使用聚合框架按降序对数组进行排序。
User.aggregate([
// Initial document match
{
$match: {
_id: ObjectId('5f7753db63cce11af6a7146e')
}
},
// Expand the completedExams array into a stream of documents
{
$unwind: '$completedExams'
},
// Sort in descending order
{
$sort: {
'completedExams.createdAt': -1
}
},
{
$group: {
_id: '$_id',
completedExams: {
$push: '$completedExams'
},
}
}
])