Сортировка по элементарному элементу денормализованного массива с запросом агрегата mongodb - PullRequest
0 голосов
/ 21 января 2019

У меня есть следующие данные в моей коллекции персонажей:

[
    {
        "_id": "1",
        "type": "warrior",
        "attributes": [
            { "name": "strength", "value": 110 },
            { "name": "dexterity", "value": 50 },
            { "name": "health", "value": 200 }
        ]
    },
    {
        "_id": "2",
        "type": "archer",
        "attributes": [
            { "name": "precision", "value": 70 },
            { "name": "dexterity", "value": 80 },
            { "name": "health", "value": 150 }
        ]
    },
    {
        "_id": "3",
        "type": "warrior",
        "attributes": [
            { "name": "strength", "value": 80 },
            { "name": "dexterity", "value": 80 },
            { "name": "health", "value": 220 }
        ]
    },
    {
        "_id": "4",
        "type": "wizard",
        "attributes": [
            { "name": "power", "value": 100 },
            { "name": "dexterity", "value": 100 },
            { "name": "health", "value": 120 }
        ]
    },
    {
        "_id": "5",
        "type": "monk",
        "attributes": [
            { "name": "strength", "value": 50 },
            { "name": "intelligence", "value": 120 },
            { "name": "health", "value": 180 }
        ]
    },
    {
        "_id": "6",
        "type": "warrior",
        "attributes": [
            { "name": "strength", "value": 90 },
            { "name": "dexterity", "value": 75 },
            { "name": "health", "value": 200 }
        ]
    }
]

Примечание: "атрибуты" - это денормализованный массив объектов (имя + значение) в моей модели.

Я пишууниверсальный сервис, позволяющий пользователям фильтровать мои данные.Этот сервис динамически создает мой «совокупный» запрос в соответствии с пользовательским вводом (выбор, условия, сортировка и т. Д.).

Я хочу вернуть всех воинов, упорядоченных по убыванию идентификатора.Сгенерированный запрос будет:

Characters.aggregate().match({ "type": "warrior" }).sort({ "_id": -1 });

Ожидаемые результаты:

[
    {
        "_id": "6",
        "type": "warrior",
        "attributes": [
            { "name": "strength", "value": 90 },
            { "name": "dexterity", "value": 75 },
            { "name": "health", "value": 200 }
        ]
    },
    {
        "_id": "3",
        "type": "warrior",
        "attributes": [
            { "name": "strength", "value": 80 },
            { "name": "dexterity", "value": 80 },
            { "name": "health", "value": 220 }
        ]
    },
    {
        "_id": "1",
        "type": "warrior",
        "attributes": [
            { "name": "strength", "value": 110 },
            { "name": "dexterity", "value": 50 },
            { "name": "health", "value": 200 }
        ]
    }
]

Теперь я хотел бы отобразить список воинов, упорядоченных по возрастанию.Я не могу отсортировать по определенному элементу моего денормализованного массива «атрибуты», и это моя проблема.

Ожидаемые результаты:

[
    {
        "_id": "3",
        "type": "warrior",
        "attributes": [
            { "name": "strength", "value": 80 },
            { "name": "dexterity", "value": 80 },
            { "name": "health", "value": 220 }
        ]
    },
    {
        "_id": "6",
        "type": "warrior",
        "attributes": [
            { "name": "strength", "value": 90 },
            { "name": "dexterity", "value": 75 },
            { "name": "health", "value": 200 }
        ]
    },
    {
        "_id": "1",
        "type": "warrior",
        "attributes": [
            { "name": "strength", "value": 110 },
            { "name": "dexterity", "value": 50 },
            { "name": "health", "value": 200 }
        ]
    }
]

Как мне получить этот результат?

1 Ответ

0 голосов
/ 22 января 2019

Попробуйте это

[
    {
        '$match': {
            'type': 'warrior'
        }
    }, {
        '$addFields': {
            "strength": {
                $filter: {
                    input: "$attributes",
                    as: "attr",
                    cond: {$eq: [ "$$attr.name", "strength"] } 
                }
            }
        }
    }, {
        '$sort': { "strength": 1 }
    }, {
        '$project': {
            'strength': 0
        }
    }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...