Проецирование поля в MongoDB на основе значения другого поля - PullRequest
0 голосов
/ 30 августа 2018

У меня есть следующий документ в коллекции MongoDB 4:

{
   "_id": <ObjectID>,
   "active_version": "3",
   "versions": {
     "1": "The first very long document",
     "2": "The second very long document",
     "3": "The third very long document"
   }
}

В коллекции много подобных документов, и каждый документ может иметь много версий.

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

1 Ответ

0 голосов
/ 30 августа 2018

Вы можете использовать $ objectToArray для преобразования versions в массив пар kv, а затем использовать $ let и $ filter с $ arrayElemAt для получения первой подходящей версии:

db.col.aggregate([
    {
        $project: {
            current_version: {
                $let: {
                    vars: {
                        version: {
                            $arrayElemAt: [
                                {
                                    $filter: {
                                        input: { $objectToArray: "$versions" },
                                        as: "v",
                                        cond: { $eq: [ "$$v.k", "$active_version" ] } 
                                    }
                                }
                            ,0]
                        }
                    },
                    in: "$$version.v"
                }
            }
        }
    }
])

Выходы:

{ "_id" : ..., "current_version" : "The third very long document" }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...