Mongodb 为什么';这不是Mongo聚合工作吗?

Mongodb 为什么';这不是Mongo聚合工作吗?,mongodb,mongoose,Mongodb,Mongoose,我觉得我肯定错过了一些明显的东西。下面是聚合,就像在shell中发布的那样: db.documents.aggregate( { $project: { title: 1, "date.year": 1, decade: { $subtract: ['$date.year', { $mod: ['$date.year', 10]}]} }}) 这应该是一个文档列表,每个文档都有一个date.year字段,并添加一个decade字段,指示文档所在的十年(1900、1910等)。我计划

我觉得我肯定错过了一些明显的东西。下面是聚合,就像在shell中发布的那样:

db.documents.aggregate(
   { $project: { title: 1, "date.year": 1, decade:
   { $subtract: ['$date.year', { $mod: ['$date.year', 10]}]}
}})
这应该是一个文档列表,每个文档都有一个date.year字段,并添加一个decade字段,指示文档所在的十年(1900、1910等)。我计划在添加该字段后进一步转换数据

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

{
    "errmsg" : "exception: $subtract resulted in a non-numeric type",
    "code" : 16413,
    "ok" : 0
}
如果我把$subtract改为$add,效果很好(当然,这并不能给我正确的结果。)那么减法是怎么回事?为什么我在减法时得到的是非数字类型,而在加法时得到的是数字类型

提前谢谢

这看起来像是一个错误-当您操作的字段未在经过管道的文档中设置时,它无法正确处理减法

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

{$match:{“date.year”:{$exists:true}}

这看起来像是一个-当您操作的字段未在经过管道的文档中设置时,它无法正确处理减法

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


{$match:{“date.year”:{$exists:true}}

在我尝试时效果很好。你的医生长什么样?嗨,约翰尼。这里有一个简略的版本:
“title”:“Something or other.”“date”:{“year”:1969,“month”:12,“day”:10,“full”:ISODate(“1970-01-10T07:00:00Z”)}
我使用不同的日期字段,因为我使用的不是所有文档(我存储在数据库中的物理文档)附有完整日期。我知道完整日期与日期部分(年、月)不匹配。这是我下一步要解决的问题。那一个也很好。你可能有一些文档的日期不是数字吗?约翰尼,你知道了!有一些文档的日期没有设置。这一定是导致问题的原因!当我尝试它时效果很好。你的文档看起来像什么?嗨,约翰尼。这是一个简略版本:
“title”:“某物或其他。”“date”:{“year”:1969,“month”:12,“day”:10,“full”:ISODate(“1970-01-10T07:00:00Z”)}
我使用不同的日期字段,因为不是我处理的所有文档(我存储在数据库中的物理文档)附上完整日期。我知道完整日期与日期部分(年、月)不匹配。这是我下一步要解决的问题。那一个也很好。你可能有一些文件的日期不是数字吗?约翰尼,你知道了!有一些文件的日期没有设置。这一定是问题的原因!谢谢你,艾西亚!我想你和约翰尼都搞定了。我已经用头撞墙好几个小时了我想弄清楚。是的,只是用$match条件集试了一下。很好!再次感谢!谢谢你,Asya!我想你和Johnny一定能搞定。我已经用了好几个小时的时间试图弄清楚。是的,只是用$match条件集试了一下。真是太好了!再次感谢!