从MongoDB Query订购结果

时间:2018-05-22 21:06:29

标签: mongodb mongoose

我通过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
        }
    }
]

非常感谢您的帮助。

1 个答案:

答案 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"
                        ]
                }
        ]
}