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

时间:2014-06-17 12:58:04

标签: mongodb aggregation-framework

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

time: Date

我希望基于一个简单的函数创建一个新的字段timeBlock

var dateToTimeBlock = function(dateString, timeBlock){
    return new Date(dateString).valueOf() / timeBlock 
}

我理解$group can add fields,但用于计算这些字段的函数似乎已构建到mongo中,例如$avg$add等。是否可以根据任意字段生成计算值?

1 个答案:

答案 0 :(得分:7)

使用聚合运算符是使用MongoDB聚合计算字段的唯一方法。如果您想使用原生JavaScript函数(例如valueOf对象上的Date),则必须使用Map-Reduce

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

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

对于您的示例,为了简化聚合框架中的操作,我会将Date转换为整数或在文档中添加一个整数的新字段(我会在其他用例中看到更多的内容' s more适当)。然后,您可以使用$divide轻松完成计算。

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

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

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