我通过Mongoose在ExpressJS中执行MongoDB查询。
我的文档如下所示
{
"name": "first",
"spellings": [
"here",
"is",
"you"
],
"keyStageLevel": 4,
"spellingLevel": 2,
"__v": 0
},
{
"name": "second",
"spellings": [
"her",
"is",
"another"
],
"keyStageLevel": 2,
"spellingLevel": 3,
"__v": 0
},
{
"name": "third",
"spellings": [
"snother",
"list"
],
"keyStageLevel": 2,
"spellingLevel": 4,
"__v": 0
}
我想让我的查询结果返回
1)keyStageLevel
按顺序排列
2)在每个keyStageLevel
内spellingLevel
按顺序显示文档的详细信息。
keyStageLevel 2
spellingLevel 3
name: "second",
"spellings": [
"her",
"is",
"another"
]
spellingLevel 4
name: "third",
"spellings": [
"snother",
"list"
]
keyStageLevel 4
spellingLevel 2
etc
我的代码目前正在运行
var spellings = await Spelling.aggregate([{"$group" : {_id:{keyStageLevel:"$keyStageLevel",spellingLevel:"$spellingLevel"}}} ]);
返回
[
{
"_id": {
"keyStageLevel": 2,
"spellingLevel": 4
}
},
{
"_id": {
"keyStageLevel": 2,
"spellingLevel": 3
}
},
{
"_id": {
"keyStageLevel": 5,
"spellingLevel": 1
}
},
{
"_id": {
"keyStageLevel": 4,
"spellingLevel": 2
}
}
]
非常感谢您的帮助。
答案 0 :(得分:1)
您最常使用$group
来积累每个"keyStageLevel"
下的剩余文档数据,这是使用$push
完成的。如果您希望按特定顺序排列结果,则始终需要$sort
,在进入$group
阶段之前和之后:
var spellings = await Spelling.aggregate([
{ "$sort": { "keyStageLevel": 1, "spellingLevel": 1 } },
{ "$group" : {
"_id": { "keyStageLevel": "$keyStageLevel" },
"data": {
"$push": {
"spellingLevel": "$spellingLevel",
"name": "$name",
"spellings": "$spellings"
}
}
}},
{ "$sort": { "_id": 1 } }
])
第一个$sort
确保通过$push
添加的项目按此顺序累积,最终确保"输出"实际上按照所需的顺序排序,因为$group
可能不会总是以任何特定的顺序返回分组的键,除非您指示这样的阶段。
这将为您提供如下输出:
{
"_id" : {
"keyStageLevel" : 2
},
"data" : [
{
"spellingLevel" : 3,
"name" : "second",
"spellings" : [
"her",
"is",
"another"
]
},
{
"spellingLevel" : 4,
"name" : "third",
"spellings" : [
"snother",
"list"
]
}
]
}
{
"_id" : {
"keyStageLevel" : 4
},
"data" : [
{
"spellingLevel" : 2,
"name" : "first",
"spellings" : [
"here",
"is",
"you"
]
}
]
}