Перегруппировка массива с другим ключом - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть структура данных:

[
            {
                "_id": {
                    "question": "Voluptatem perferendis voluptas ex.",
                    "option": "Vero rerum qui animi quia assumenda."
                },
                "votes_by_gender": [
                    {
                        "user_gender": "F",
                        "total_votes": 1
                    },
                    {
                        "user_gender": "M",
                        "total_votes": 2
                    }
                ]
            },
            {
                "_id": {
                    "question": "Voluptatem perferendis voluptas ex.",
                    "option": "Suscipit iste molestias est est porro et atque."
                },
                "votes_by_gender": [
                    {
                        "user_gender": "M",
                        "total_votes": 2
                    }
                ]
            }, {...} , ...
]

Мне нужно перегруппировать ее.Мне нужен «вопрос» в верхней части маршрута, и все остальное тоже самое.Итак, я объясняю что-то вроде:

[
 { _id : '$question', options : [{option, votes_by_gender},{...} ...] },
 ....
]

Как я могу это сделать?

1 Ответ

0 голосов
/ 22 ноября 2018

Вам нужно $unwind перед вами $group:

db.collection.aggregate([
  { "$unwind": "$votes_by_gender" },
  { "$group": {
    "_id": "$_id.question",
    "options": {
      "$push": {
        "option": "$_id.option",
        "votes_by_gender": "$votes_by_gender"
      }
    }
  }}
])

Что бы вывести как:

{
        "_id" : "Voluptatem perferendis voluptas ex.",
        "options" : [
                {
                        "option" : "Vero rerum qui animi quia assumenda.",
                        "votes_by_gender" : {
                                "user_gender" : "F",
                                "total_votes" : 1
                        }
                },
                {
                        "option" : "Vero rerum qui animi quia assumenda.",
                        "votes_by_gender" : {
                                "user_gender" : "M",
                                "total_votes" : 2
                        }
                },
                {
                        "option" : "Suscipit iste molestias est est porro et atque.",
                        "votes_by_gender" : {
                                "user_gender" : "M",
                                "total_votes" : 2
                        }
                }
        ]
}

Конечно, если вы просто хотите свести «вопрос» только вместе, не перегруппировывая содержимое массива, то вы просто $group

db.collection.aggregate([
  { "$group": {
    "_id": "$_id.question",
    "options": {
      "$push": {
        "option": "$_id.option",
        "votes_by_gender": "$votes_by_gender"
      }
    }
  }}
])

, который будет выводить как:

{
        "_id" : "Voluptatem perferendis voluptas ex.",
        "options" : [
                {
                        "option" : "Vero rerum qui animi quia assumenda.",
                        "votes_by_gender" : [
                                {
                                        "user_gender" : "F",
                                        "total_votes" : 1
                                },
                                {
                                        "user_gender" : "M",
                                        "total_votes" : 2
                                }
                        ]
                },
                {
                        "option" : "Suscipit iste molestias est est porro et atque.",
                        "votes_by_gender" : [
                                {
                                        "user_gender" : "M",
                                        "total_votes" : 2
                                }
                        ]
                }
        ]
}

Но это массивы внутри массивов, и в действительности это не рекомендуется, даже если вы думали, что хотите этого.

...