首页 > 解决方案 > 来自 MongoDB 查询的排序结果

问题描述

我正在通过 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)在每个keyStageLevelspellingLevel按顺序显示文档的详细信息。

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
        }
    }
]

非常感谢您的帮助。

标签: mongodbmongoose

解决方案


您最关心$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"
                        ]
                }
        ]
}

推荐阅读