$group 使用 $month 不在字符串化日期上工作
$group using $month not working on stringified date
我正在使用 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"
}
为什么我会收到 'unknown group operator $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
运算符的 docs:
... The argument can be any expression as long as it resolves to a date ...
当您向运算符传递一个字符串时,它显然无法解析为日期,因此不起作用。
解决此问题的方法是获取日期的正确子字符串
$group: {
_id: { $substr : ["$transaction_date", 5, 2 ] },
"net_revenue" : { $sum: "item_net_total_value" },
}
顺便说一句:我没有使用 mLab,但如果他们不允许日期,我会感到惊讶。将此答案视为中间 'solution' 但我建议要么针对 mLab 和日期的问题创建一个新问题,要么只是询问他们中的某个人以确保您猜测的限制是正确的,因为从长远来看它是最好使用正确的数据类型。
我正在使用 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"
}
为什么我会收到 'unknown group operator $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
运算符的 docs:
... The argument can be any expression as long as it resolves to a date ...
当您向运算符传递一个字符串时,它显然无法解析为日期,因此不起作用。
解决此问题的方法是获取日期的正确子字符串
$group: {
_id: { $substr : ["$transaction_date", 5, 2 ] },
"net_revenue" : { $sum: "item_net_total_value" },
}
顺便说一句:我没有使用 mLab,但如果他们不允许日期,我会感到惊讶。将此答案视为中间 'solution' 但我建议要么针对 mLab 和日期的问题创建一个新问题,要么只是询问他们中的某个人以确保您猜测的限制是正确的,因为从长远来看它是最好使用正确的数据类型。