【问题标题】:MongoDB Aggregation - Dynamic `$addField`MongoDB 聚合 - 动态`$addField`
【发布时间】:2020-07-27 18:14:23
【问题描述】:

我有以下 _id: userID 格式的对象和一个 Mongoose 查询:

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",
        ...
    }
]

我该怎么做?

【问题讨论】:

    标签: javascript node.js mongodb mongoose aggregation-framework


    【解决方案1】:

    您需要从$objectToArray 开始,以将您的动态对象作为键和值的数组。然后您可以使用$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"
                    }
                }
            }
        }
    ])
    

    Mongo Playground

    【讨论】:

    • 这个对象是在聚合之前用 JavaScript 动态生成的,它不是文档的一部分:{ 111: "222", 333: "444", 555: "666" }。我将编辑我的问题以使其更清楚
    • @APixelVisuals 抱歉,现在应该没问题了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    相关资源
    最近更新 更多