MongoDB объединяет массив объектов по идентификатору объекта и количеству вхождений - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь выяснить, что я делаю неправильно, я собрал следующее: " Подмножество данных ", " Желаемый вывод "

Вот так выглядят мои объекты данных

[{
  "survey_answers": [
    {
      "id": "9ca01568e8dbb247", // As they are, this is the key to groupBy
      "option_answer": 5, // Represent the index of the choosen option
      "type": "OPINION_SCALE" // Opinion scales are 0-10 (meaning elleven options)
    },
    {
      "id": "ba37125ec32b2a99",
      "option_answer": 3,
      "type": "LABELED_QUESTIONS" // Labeled questions are 0-x (they can change it from survey to survey)
    }
  ],
  "survey_id": "test"
},
{
  "survey_answers": [
    {
      "id": "9ca01568e8dbb247",
      "option_answer": 0,
      "type": "OPINION_SCALE"
    },
    {
      "id": "ba37125ec32b2a99",
      "option_answer": 3,
      "type": "LABELED_QUESTIONS"
    }
  ],
  "survey_id": "test"
}]

Мой желаемый результат:

[
  {
    id: '9ca01568e8dbb247'
    results: [
      { _id: 5, count: 1 },
      { _id: 0, count: 1 }
    ]
  },
  {
    id: 'ba37125ec32b2a99'
    results: [
      { _id: 3, count: 2 }
    ]
  }
]

Активный запрос

Model.aggregate([
    {
        $match: {
            'survey_id': survey_id
        }
    },
    {
        $unwind: "$survey_answers"
    },
    {
        $group: {
            _id: "$survey_answers.option_answer",
            count: {
                $sum: 1
            }
        }
    }
])

токовый выход

[
    {
        "_id": 0,
        "count": 1
    },
    {
        "_id": 3,
        "count": 2
    },
    {
        "_id": 5,
        "count": 1
    }
]

1 Ответ

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

Я добавил ваши записи в мою базу данных. Пост, что я попробовал ваши команды одну за другой.

$ результаты, похожие на -

> db.survey.aggregate({$unwind: "$survey_answers"})

{ "_id" : ObjectId("5c3859e459875873b5e6ee3c"), "survey_answers" : { "id" : "9ca01568e8dbb247", "option_answer" : 5, "type" : "OPINION_SCALE" }, "survey_id" : "test" }
{ "_id" : ObjectId("5c3859e459875873b5e6ee3c"), "survey_answers" : { "id" : "ba37125ec32b2a99", "option_answer" : 3, "type" : "LABELED_QUESTIONS" }, "survey_id" : "test" }
{ "_id" : ObjectId("5c3859e459875873b5e6ee3d"), "survey_answers" : { "id" : "9ca01568e8dbb247", "option_answer" : 0, "type" : "OPINION_SCALE" }, "survey_id" : "test" }
{ "_id" : ObjectId("5c3859e459875873b5e6ee3d"), "survey_answers" : { "id" : "ba37125ec32b2a99", "option_answer" : 3, "type" : "LABELED_QUESTIONS" }, "survey_id" : "test" }

Я не добавляю код для совпадения, так как это нормально и в вашем запросе

Группировка будет -

> db.survey.aggregate({$unwind: "$survey_answers"},{$group: { _id: { 'optionAnswer': "$survey_answers.option_answer", 'id':"$survey_answers.id"}, count: { $sum: 1}}})

{ "_id" : { "optionAnswer" : 0, "id" : "9ca01568e8dbb247" }, "count" : 1 }
{ "_id" : { "optionAnswer" : 3, "id" : "ba37125ec32b2a99" }, "count" : 2 }
{ "_id" : { "optionAnswer" : 5, "id" : "9ca01568e8dbb247" }, "count" : 1 }

Вы можете группировать по $survey_answers.id, чтобы вывести его в проекцию.

Проекция - это то, что вам не хватает в вашем запросе -

> db.survey.aggregate({$unwind: "$survey_answers"},{$group: { _id: { 'optionAnswer': "$survey_answers.option_answer", 'id':'$survey_answers.id'}, count: { $sum: 1}}}, {$project : {answer: '$_id.optionAnswer', id: '$_id.id', count: '$count', _id:0}})

{ "answer" : 0, "id" : "9ca01568e8dbb247", "count" : 1 }
{ "answer" : 3, "id" : "ba37125ec32b2a99", "count" : 2 }
{ "answer" : 5, "id" : "9ca01568e8dbb247", "count" : 1 }

Далее вы можете добавить группу по идентификатору и добавить результаты в набор. И ваш последний запрос будет -

db.survey.aggregate(
    {$unwind: "$survey_answers"},
    {$group: { 
        _id: { 'optionAnswer': "$survey_answers.option_answer", 'id':'$survey_answers.id'}, 
        count: { $sum: 1}
    }}, 
    {$project : {
        answer: '$_id.optionAnswer', 
        id: '$_id.id', 
        count: '$count',
        _id:0
    }}, 
    {$group: {
        _id:{id:"$id"},
        results: { $addToSet: {answer: "$answer", count: '$count'} }
    }},
    {$project : {
        id: '$_id.id',
        answer: '$results', 
        _id:0
    }})

Надеюсь, это поможет.

...