Агрегация MongoDB - Dynami c `$ addField` - PullRequest
1 голос
/ 15 апреля 2020

У меня есть следующий объект в формате _id: userID и запрос Mon goose:

const obj = {
    111: "222",
    333: "444",
    555: "666"
};

Model.aggregate([
    {
        $addFields: {
            userID: ???
        }
    }
]);

Мне нужен способ добавить поле userID в каждый документ на основе объекта. Допустим, в коллекции есть эти данные:

[
    {
        _id: "111",
        ...
    },
    {
        _id: "333",
        ...
    },
    {
        _id: "555",
        ...
    }
]

Документ должен выглядеть примерно так:

[
    {
        _id: "111",
        userID: "222",
        ...
    },
    {
        _id: "333",
        userID: "444",
        ...
    },
    {
        _id: "555",
        userID: "666",
        ...
    }
]

Как я могу это сделать?

1 Ответ

1 голос
/ 15 апреля 2020

Вам нужно начать с $ objectToArray , чтобы получить свой динамический c объект в виде массива ключей и значений. Затем вы можете использовать $ filter для поиска подходящей пары, $ arrayElemAt для получения одного элемента:

db.collection.aggregate([
    {
        $addFields: {
            userId: {
                $let: {
                    vars: { 
                        match: { 
                            $arrayElemAt: [ 
                                { 
                                    $filter: { 
                                        input: { $objectToArray: {  111: "222", 333: "444", 555: "666" } }, 
                                        cond: { $eq: [ "$$this.k", { $toString: "$_id" } ] }
                                    } 
                                },
                                0 
                            ] 
                        }
                    },
                    in: "$$match.v"
                }
            }
        }
    }
])

Пн go Детская площадка

...