Как получить все соответствующие объекты подмассива в mongoDB

У меня есть следующий JSON

[
  {
    "_id": "5c87e621257db42508007f3b",
    "uuid": "8b03dba7-db96-40d0-8dd9-6a65efd6719a",
    "user_answers": [
      {
        "profile_section_code": "MY_PROFILE",
        "profile_question_code": "STANDARD_EDUCATION",
        "selected_answer": [
          "2"
        ]
      },
      {
        "profile_section_code": "MY_PROFILE",
        "profile_question_code": "ETHNICITY",
        "selected_answer": [
          "2"
        ]
      },
      {
        "profile_section_code": "FAMILY",
        "profile_question_code": "STANDARD_HHI_US",
        "selected_answer": [
          "11"
        ]
      },
      {
        "profile_section_code": "FAMILY",
        "profile_question_code": "STANDARD_HH_ASSETS",
        "selected_answer": [
          "5"
        ]
      },
      {
        "profile_section_code": "AUTOMOTIVE",
        "profile_question_code": "STANDARD_AUTO_DECISION_MAKER",
        "selected_answer": [
          "1"
        ]
      }
    ],
    "created_at": "2019-03-12T17:02:25.000Z"
  }
]

Полный JSON можно увидеть здесь: Связь

Я хочу получить все user_answers с помощью "profile_section_code": "MY_PROFILE" Ожидаемый результат должен быть таким

{ "_id": "5c87e621257db42508007f3b", "uuid": "8b03dba7-db96-40d0-8dd9-6a65efd6719a", "user_answers": [ { "profile_section_code": "MY_PROFILE", "profile_question_code": "STANDARD_EDUCATION", "selected_answer": [ "2" ] }, { "profile_section_code": "MY_PROFILE", "profile_question_code": "ETHNICITY", "selected_answer": [ "2" ] }],"created_at": "2019-03-12T17:02:25.000Z" }

Я попробовал $elemMatch в Projection, но он возвращает единственный массив совпадений 1, мне нужно что-то вроде $elemMatch, но он должен возвращать весь массив совпадений. вот Скрипка для того же

Я также пытался использовать этот ответ, но это не сработало, так как возвращал только первый соответствующий подмассив.

  • Есть ли способ сделать это, используя только проекцию (я хочу избежать агрегации, так как мне нужно реализовать это на PHP)
  • Если выше это невозможно, то как я могу реализовать это с помощью агрегата?

Пожалуйста, дайте мне знать, что я могу сделать, чтобы исправить это

См. stackoverflow.com/questions/3985214/…

Mani 12.03.2019 21:30
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
4
1
149
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте $filter, чтобы получить ожидаемый результат. Кроме того, похоже, что конвейер агрегации — единственный вариант фильтрации записей, или это необходимо сделать на уровне кода PHP.

[
    {
        '$addFields': {
            'user_answers': {
                '$filter': {
                    'input': '$user_answers', 
                    'as': 'user_answer', 
                    'cond': {
                        '$eq': [
                            '$$user_answer.profile_section_code', 'MY_PROFILE'
                        ]
                    }
                }
            }
        }
    }
]

Спасибо. Это сработало. Нужна еще одна помощь - могу ли я узнать, есть ли у меня тяжелый документ, что было бы лучше в этом случае Агрегация или Фильтрация через PHP. Я понимаю, что это неопределенный вопрос из-за различных факторов, но что вы думаете?

Pankaj Jha 13.03.2019 09:49

Я бы сказал, что агрегация — лучший вариант по сравнению с выполнением этого в PHP, потому что инфраструктура агрегации фильтрует записи из MongoDB и отправляет в код только отфильтрованные записи, а наоборот — все данные отправляются в код, и это дороже, чем инфраструктура агрегации. .

Mani 13.03.2019 21:39

Другие вопросы по теме