Как получить все соответствующие объекты подмассива в mongoDB - PullRequest
2 голосов
/ 12 марта 2019

У меня есть следующие 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, но я должен вернуть весь соответствующий массив. вот скрипка для того же

Я также пытался использовать этот ответ Но это не сработало, поскольку он возвращал только 1-й соответствующий subArray

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

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

1 Ответ

2 голосов
/ 12 марта 2019

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

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