我有一个用例,我需要在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
]
}
})
游乐场