我觉得我必须遗漏一些明显的东西。这是聚合,因为将其发布在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,它可以正常工作(但当然不会给我正确的结果。)那么减法会发生什么?为什么我在减去时会得到非数字类型,但在添加时会得到一个数字?
提前致谢!
答案 0 :(得分:3)
这看起来像bug in the aggregation framework - 如果您正在操作的字段未在通过管道的文档中设置,则它不能正确处理减法。
它已在2.3.2中修复(我无法重现这一点 - 当“日期”未设置时它会投影“null”)但是解决此限制的一种方法是在管道中添加$ match条件,即前缀{$ project}:
{$match: {"date.year":{$exists:true}}}