Пн go совокупные поля сбора и проекта - PullRequest
1 голос
/ 12 марта 2020

У меня есть 2 коллекции.

модель коллекции 1:

{
    "_id" : "abcdefgh",
    "questionType" : "multiselect",
    "question" : "how do you feel",
    "options" : [
        {
            "option" : "Good ",
            "additionalTextRequired" : false
        },
        {
            "option" : "Bad",
            "additionalTextRequired" : false
        }
    ],
    "active" : false,
}

модель коллекции 2:

{
    "_id" : "bhanu",
    "someunrelatedfield":"dasf",
    "responses" : [
        {
            "questionId" : "abcdefgh",
            "response" : [
                "Good"
            ],
            "valid" : true,
            "unrelatedfield":"dontprojectthese",
        },
        {
            "questionId" : "someotherid",
            "response" : [
                "cool"
            ],
            "valid" : true,
        }
    ],
}

Я хочу получить следующий результат после запроса,

{
    "_id":"bhanu",
    "responses":[
        {
             "question": "how do you feel",
             "response": [
                    "good"
               ]
              "valid":true,
       }
    ]
}

По сути, я хочу заменить «questionId» на «question» в коллекции 2 и проектировать указанные поля. Как я могу написать запрос для этого?

1 Ответ

1 голос
/ 12 марта 2020

Вам необходимо выполнить MongoDB агрегирование с оператором $lookup, например:

db.collection2.aggregate([
  {
    $lookup: {
      from: "collection1",
      localField: "responses.questionId",
      foreignField: "_id",
      as: "tmp"
    }
  },
  {
    $addFields: {
      responses: {
        $map: {
          input: "$responses",
          as: "response",
          in: {
            $mergeObjects: [
              "$$response",
              {
                $arrayElemAt: [
                  {
                    $filter: {
                      input: "$tmp",
                      cond: {
                        $eq: [
                          "$$response.questionId",
                          "$$this._id"
                        ]
                      }
                    }
                  },
                  0
                ]
              }
            ]
          }
        }
      }
    }
  },
  {
    $unset: [
      "responses.questionId"
      //put here all fields to be removed
    ]
  }
])

MongoPlayground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...