$getField等价于mongodb的聚合管道



我有一个用例,我需要在MongoDB聚合中获得给定字段的值(仅字段名称以字符串形式给出),文档的结构如下:

{
   customer_id: '23424'
   customer_23424_value: 5000 
}

在Mongo Aggregation管道中,$getField操作符非常适合获取字符串中给定字段名的值,例如

    {
      $getField: {
        field: 'customer_'+"$customer_id"+'_value' // 'customer_23424_value' can be written using concatenation
      }
    }

$getField操作符从版本5开始引入MongoDB,但我的生产机器运行在4.4中。是否有任何有效的等效$getField在4.4或任何其他的解决方案来做同样的

没有直接的方法来处理这种情况,只是参考下面的查询它在性能上是昂贵的,

  • $objectToArray将根对象转换为键值格式的数组
  • $filter对上述转换数组
  • 进行迭代循环
  • $concat通过连接所需字段创建键名
  • 上述进程将返回过滤后的属性
  • $let创建一个变量来存储上述过滤的结果,并使用$first
  • 返回第一个元素值
  • $eq检查条件上述值等于5000
db.collection.find({
  $expr: {
    $eq: [
      {
        $let: {
          vars: {
            root: {
              $filter: {
                input: { $objectToArray: "$$ROOT" },
                cond: {
                  $eq: [
                    "$$this.k",
                    { $concat: ["customer_", "$customer_id", "_value"] }
                  ]
                }
              }
            }
          },
          in: { $first: "$$root.v" }
        }
      },
      5000
    ]
  }
})

游乐场

最新更新