0

我觉得我一定遗漏了一些明显的东西。这是聚合,因为人们会将其发布在 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,它可以正常工作(但当然不会给我正确的结果。)那么减法是怎么回事?为什么我减去时得到一个非数字类型,而当我加时得到一个数字?

提前致谢!

4

1 回答 1

3

这看起来像是聚合框架中的一个错误- 当您操作的字段未在通过管道的文档中设置时,它没有正确处理减法。

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

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

于 2013-02-05T04:32:01.567 回答