首页 > 解决方案 > MongoDB动态子字段名称

问题描述

我有一个像这样的文件:

{
  idx: {a: 1, b: 2, c: 3},
  v: "a"
}

在聚合查询中,我想x通过获取 的值v并使用它在idx. 生成的文档如下所示:

{
  idx: {a: 1, b: 2, c: 3},
  v: "a",
  x: 1
}

我已经尝试过类似的东西$addFields: {x: "$idx.$a"}$addFields: {x: "$idx[$a]"}但这些都不起作用。我已经扫描了管道运营商的名单,但没有看到任何有用的信息。这可能吗?

标签: mongodbaggregation-framework

解决方案


没有简单的方法,但您可以利用$objectToArray运算符获取idx键和值的数组,然后使用$filter$arrayElemAt来获取匹配的元素。

db.collection.aggregate([
        {
            $addFields: {
                x: {
                    $let: {
                        vars: {
                            match: {
                                $arrayElemAt: [
                                    { $filter: { input: { $objectToArray: "$idx" }, cond: { $eq: [ "$$this.k", "$v" ] } } },
                                    0
                                ]
                            }
                        },
                        in: "$$match.v"
                    }
                }
            }
        }
    ])

蒙戈游乐场


推荐阅读