Mongodb 使用$month的$group未在字符串化日期工作

Mongodb 使用$month的$group未在字符串化日期工作,mongodb,mongodb-aggregation,Mongodb,Mongodb Aggregation,我使用的mLab似乎不想让我使用ISODate(“2016-06-16T00:00:00.201Z”),因此我最终不得不将mLab中的所有日期作为字符串行“transaction_date”:“2016-06-16T00:00:00.201Z” 对于我的数据范围,有一个严格的日期似乎很好: $match { "transaction_date" : {$gte: "2016-04-01"}, "transaction_date" : {$lt: "2016-08-01"},

我使用的mLab似乎不想让我使用ISODate(“2016-06-16T00:00:00.201Z”),因此我最终不得不将mLab中的所有日期作为字符串行
“transaction_date”:“2016-06-16T00:00:00.201Z”

对于我的数据范围,有一个严格的日期似乎很好:

$match {
   "transaction_date" : {$gte: "2016-04-01"}, 
   "transaction_date" : {$lt: "2016-08-01"}, 
       }
然而,它不喜欢在我尝试进行最后一组时使用日期来按月数汇总结果

$group {
   "revenue_month" : {$month : "transaction_date"},
   "net_revenue" : {$sum: "item_net_total_value"
       }
知道我为什么收到“未知组操作员$month”消息吗?谢谢

以下是完整的脚本:

db.datawarehouse.aggregate(

// Pipeline
[
// Stage 1 - Isolate correct document types
{
  $match: {
  "object_class" : "Goods & Services Transaction", 
  "object_type": "Transaction", 
  "object_category" : "Revenue",
  "object_origin_category" : "Bookkeeping"
  }
},

// Stage 2 - Restrict data set by date range
{
  $match: {
  "transaction_date" : {$gte: "2016-04-01"}, 
  "transaction_date" : {$lt: "2016-08-01"}, 
  }
},

// Stage 3 - For duplicate handling, sort by invoice number in descending creation date order
{
  $sort: {
  "transaction_reference":1, 
  "object_creation_date": -1
  }
},

// Stage 4 - For duplicate handing use $first to use latest version of all documents
{
  $group: {
  _id: "$transaction_reference", 
  "party_uuid" : {$first: "$party_uuid"},
  "transaction_date" : {$first: "$transaction_date"},
  "transaction_net_value" : {$first: "$transaction_net_value"},
  "object_category" : {$first: "$object_category"},
  "transaction_status" : {$first: "$transaction_status"},
  "object_origin_category" : {$first: "$object_origin_category"},
  "object_origin" : {$first: "$object_origin"},
  "customer" : {$first: "$party.customer.customer_name"},
  "goods_and_services" : {$first: "$goods_and_services"}
  }
},

// Stage 5 - Widen set from transaction level to line item level
{
  $unwind: "$goods_and_services"
},

// Stage 6 - Make the complete data set required per record
{
  $project: {
  {"_id" : 1,
    "party_uuid" : "$party_uuid",
    "transaction_date" : "$transaction_date",
    "transaction_net_value" : "$transaction_net_value",
    "object_category" : "$object_category",
    "object_origin_category" : "$object_origin_category",
    "object_origin" : "$object_origin",
    "item_quantity" : "$goods_and_services.item_quantity",
    "item_name" : "$goods_and_services.item_name",
    "item_category" : "$goods_and_services.item_category",
    "item_ net_total_sale_value" : "$goods_and_services.item_net_total_value",
  }
},

// Stage 7 - Restrict records by item category
{
  $match: {
  "item_category" : "Sales Revenue"
  }
}
// Stage 8 - Group by transaction_date and SUM item_net_total_value
]

);
关于
$组
操作员,请参见:

。。。参数可以是任何表达式,只要它解析为日期

当您向运算符传递字符串时,它显然无法解析为日期,因此无法工作

解决这个问题的一个方法是使用日期的适当子字符串

$group: {
    _id: { $substr : ["$transaction_date", 5, 2 ] },
    "net_revenue" : { $sum: "item_net_total_value" },
}

顺便说一句:我没有使用mLab,但如果他们不允许日期,我会感到惊讶。将此答案视为中间“解决方案”,但我建议您要么针对mLab和日期的问题创建一个新问题,要么让他们中的某个人确保您猜测的限制是真实的,因为从长远来看,最好使用正确的数据类型

这很好用,谢谢。我发现大多数JSON验证器不接受ISODate。我向mLab询问过,他们说它使用扩展的JSON规范,而不是Javascript符号。我退房了,但还是不明白。你知道日期应该以什么格式输入吗,就像我直接编写JSON文档一样?谢谢,我有一个大脑放屁的时刻,现在我已经添加了组,我得到了月份和总结值。我已尝试添加上一个
$project
中的其他值,但不起作用。我只是试着把他们加入这个群体——我做错了吗?谢谢,我猜您可能想用$first或$last来添加它们,比如$group{u id.,“净收入”:…,“party{u uuid”:{$first:$PARY{u uuid”}…-因为您必须决定可能的多个值中的哪一个(现在正在分组)您希望保留最终的聚合结果谢谢,它现在正在运行,但我非常确定我已经加倍努力完成了这项工作,我可能会尝试在最后完成我的
$project
,但不完全确定我是否能够正常运行。我遇到的问题是有两种不同类型的trans同一个月内的操作。如果我在组中包括
item\u category
,并且必须先选择
$first
,则我在该月仅获得一个类别。例如:第5个月应同时具有销售收入数字和销售费用数字-通过使用此分组,它将交易价值相加,并选择按sal对其进行分类如果你明白我的意思,谢谢