2013-02-05 99 views
0

我觉得我一定会错过一些明显的东西。这里是聚集,作为一个将它张贴在shell:为什么Mongo聚合不起作用?

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 
} 

如果我改变$减去至$添加,它工作正常(但不给我正确的结果,当然。 )那么减法是怎么回事?为什么我在减法时得到一个非数字类型,而在添加时却是一个数字?

在此先感谢!

+0

工作得很好,当我尝试过。你的文档是什么样的? – JohnnyHK

+0

嗨,约翰尼。以下是删节版本: '“title”:“某物或其他”。 “日期”:{ “年”:1969年, “月”:12, “天”:10, “全”:ISODate( “1970-01-10T07:00:00Z”) }' 我使用不同的日期字段,因为并非我正在使用的所有文档(我存储在数据库中的物理文档)都附有完整日期。 – Terrence

+0

我知道完整日期与日期部分(年,月)不匹配。这是我接下来要解决的问题。 – Terrence

回答

3

这看起来像一个bug in the aggregation framework - 当您正在操作的字段没有在通过管道的文档中设置时,它不会正确处理减法。

它已经在2.3.2中修复了(我不能再现这个 - 当未设置“日期”时,它投影为“null”),但您可以绕过此限制的一种方法是向您的$ match条件添加一个管道,即前缀{$项目}有:

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

+0

谢谢Asya!我认为你和约翰尼钉住了它。试图弄清楚,我已经把头靠在墙上几个小时。 – Terrence

+0

是的,只是尝试与$匹配条件设置。这样做的工作。太棒了!再次感谢! – Terrence