Результаты заказа из MongoDB Query - PullRequest
0 голосов
/ 23 мая 2018

Я выполняю запрос MongoDB в ExpressJS через Mongoose.

У меня есть документы, похожие на приведенные ниже

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

Большое спасибо за любую помощь.

1 Ответ

0 голосов
/ 23 мая 2018

То, что вы чаще всего используете, - это использование $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"
                        ]
                }
        ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...