将字符串转换为MongoDB投影中的数字

Jes*_*ish 9 mongodb mongodb-query

我有一组文档,其值已知为数字,但存储为字符串.更改字段的类型是我无法控制的,但我想在聚合中使用该字段(例如,对其进行平均).

似乎我应该在分组之前使用投影,并且在该投影中根据需要转换字段.我似乎无法正确地得到语法 - 我尝试的一切都给了我NaN,或者在聚合的下一步中简单地丢失了新字段.

$project: {
    value: '$value',
    valueasnumber: ????
}
Run Code Online (Sandbox Code Playgroud)

鉴于上面的一个非常简单的例子,其中所有文档中$ value的内容都是字符串类型,但是将解析为一个数字,我该怎么做使valueasnumber一个新的(不存在的)字段,其类型为double,并且已解析它的价值是多少?

我尝试过类似下面的例子(以及大约十几个类似的东西):

{ $add: new Number('$value').valueOf() }
new Number('$value').valueOf()
Run Code Online (Sandbox Code Playgroud)

我完全吠叫了错误的树吗?任何帮助将不胜感激!

(要100%清楚,下面是我想要使用新字段的方式).

$group {
    score: {
        $avg: '$valueasnumber'
    }
}
Run Code Online (Sandbox Code Playgroud)

Vij*_*wat 3

我能想到的方法之一是使用 mongo shell javascript 通过在现有文档或新文档中添加新的数字字段、valuesasnumber(现有字符串“值”字段的数字转换)来修改文档。然后使用该数字字段进行进一步计算。

db.numbertest.find().forEach(function(doc) {
    doc.valueasnumber = new NumberInt(doc.value);
    db.numbertest.save(doc);
});
Run Code Online (Sandbox Code Playgroud)

使用 valueasnumber 字段进行数值计算

db.numbertest.aggregate([{$group : 
   {_id : null, 
    "score" : {$avg : "$valueasnumber"}
   }
}]);
Run Code Online (Sandbox Code Playgroud)