如何使用Mongo聚合框架的任意函数添加计算字段?

mik*_*ana 5 mongodb aggregation-framework

我正在使用MongoDB的Aggregate Framework.我的每个文档中都有一个现有字段:

time: Date
Run Code Online (Sandbox Code Playgroud)

我希望timeBlock基于一个简单的函数创建一个新的领域:

var dateToTimeBlock = function(dateString, timeBlock){
    return new Date(dateString).valueOf() / timeBlock 
}
Run Code Online (Sandbox Code Playgroud)

据我所知,$组可以添加字段,但用于计算这些领域的功能似乎被内置到蒙戈,如$avg,$add是否有可能生成基于任意字段计算值?

Chr*_*n P 7

使用聚合运算符是使用MongoDB聚合计算字段的唯一方法.如果要使用本机JavaScript函数(如valueOfon Date对象),则必须使用Map-Reduce.

虽然聚合框架不如Map-Reduce灵活,但在大多数情况下它会明显更快.

如果性能对此操作至关重要,如果可能,我建议您预先计算这些字段并进行查询.

为了您的示例,为了简化聚合框架中的操作,我将Date转换为整数或在文档中添加一个整数的新字段(我会在其他用例中看到更合适的).然后你可以轻松地用$ divide进行计算.

db.coll.aggregate([
    { $project : { dateToTime: { $divide : [ "$timeInt", timeBlock ] }}}
]);
Run Code Online (Sandbox Code Playgroud)

或者,如果timeBlock是同一文档中的字段,您可以这样做:

db.coll.aggregate([
    { $project : { dateToTime: { $divide : [ "$timeInt", "$timeBlock" ] }}}
]);
Run Code Online (Sandbox Code Playgroud)