Database errmsg";:&引用;can';t从BSON类型字符串转换为日期

Database errmsg";:&引用;can';t从BSON类型字符串转换为日期,database,mongodb,date,aggregation-framework,operators,Database,Mongodb,Date,Aggregation Framework,Operators,我试图将给定年份的月销售额和年销售额相加。因此,我遵循文档以及其他人对该代码所做的操作: `db.sales.aggregate([{$project: {year: {$year: "saleDate"}, month: {$month: "saleDate"}, dayOfMonth: {$dayOfMonth: "saleDate"}}}, {$group: {_id: {year: '$year', month: '$month'},

我试图将给定年份的月销售额和年销售额相加。因此,我遵循文档以及其他人对该代码所做的操作:

`db.sales.aggregate([{$project: {year: {$year: "saleDate"}, month: {$month: "saleDate"}, dayOfMonth: 
                    {$dayOfMonth: "saleDate"}}}, {$group: {_id: {year: '$year', month: '$month'}, 
                     count: {$sum: 1}}}]);
但它返回错误:
“errmsg”:“无法从BSON类型字符串转换为日期”

我不明白为什么Compass中的模式说它是“日期”类型

我尝试了使用“new Date”函数的另一种方法,但没有得到任何错误,但没有得到任何结果。。我不知道如何在mongo中处理日期

`db.sales.aggregate([{$match: {'saleDate': {$gte: {$dayOfYear: new Date("2017-06-01")}, 
                      $lt: {$dayOfYear: new Date("2017-07-01")}}}}, 
                      {$group: {_id: { 'numberofSales': {$sum: 1}}}}])  

第一个查询的问题是缺少美元符号,MongoDB将
saleDate
视为硬编码的字符串,而将
$saleDate
视为字段引用,请尝试:

db.sales.aggregate([{$project: {year: {$year: "$saleDate"}, month: {$month: "$saleDate"}, dayOfMonth: 
                    {$dayOfMonth: "$saleDate"}}}, {$group: {_id: {year: '$year', month: '$month'}, 
                    count: {$sum: 1}}}]);
更多


您的第二个查询将不起作用,因为您正试图将返回的数字与日期字段进行比较。

太棒了!非常感谢。我对那些美元符号仍然有困难。在引用字段名时,何时使用它们以及何时不使用它们。有时它会让我犯错误,说“不要”,但在这种情况下,你会这样做!但我不明白为什么这不是错误信息,而不是“saleDate”显然是日期时的“Cant convert BSON type to date”type@BenSmith通常,您不应该使用in
find
语句和
$match
。每隔一个管道阶段将不带美元符号的字符串解释为“固定”值。如果您有任何情况,请将您的查询和示例文档发布到mongoplayground.net中-我稍后会尝试查看