为什么这个Mongo聚合不起作用?

时间:2013-02-05 03:49:52

标签: mongodb mongoose

我觉得我必须遗漏一些明显的东西。这是聚合,因为将其发布在shell中:

db.documents.aggregate(
   { $project: { title: 1, "date.year": 1, decade:
   { $subtract: ['$date.year', { $mod: ['$date.year', 10]}]}
}})

这应该是一个文档列表,每个文档都有一个date.year字段,并添加一个十年字段,指示文档所处的十年(1900,1910等)我正在计划进一步转换数据在我得到这个之后。

问题在于,当我运行聚合时,我得到:

{
    "errmsg" : "exception: $subtract resulted in a non-numeric type",
    "code" : 16413,
    "ok" : 0
}

如果我将$ subtract更改为$ add,它可以正常工作(但当然不会给我正确的结果。)那么减法会发生什么?为什么我在减去时会得到非数字类型,但在添加时会得到一个数字?

提前致谢!

1 个答案:

答案 0 :(得分:3)

这看起来像bug in the aggregation framework - 如果您正在操作的字段未在通过管道的文档中设置,则它不能正确处理减法。

它已在2.3.2中修复(我无法重现这一点 - 当“日期”未设置时它会投影“null”)但是解决此限制的一种方法是在管道中添加$ match条件,即前缀{$ project}:

{$match: {"date.year":{$exists:true}}}