mongodb 中的聚合和 MapReduce
aggregation and MapReduce in mongodb
我收集了包含错误类型和错误日志日期的错误日志,因为 error_type 和 error_date.what 我需要执行的是来自特定月份类型的组错误日志,我使用 $group 作为聚合管道来按月或根据错误类型进行分组。想要获取的数据是这样的
[{
_id: 10, ///month wise group
logs: {
error_type1: ["error logs array of type 1"],
error_type2: ["error logs array of type 2"]
}
},
{
_id: 11, ///month wise group
logs: {
error_type1: ["error logs array of type 1"],
error_type2: ["error logs array of type 2"]
}
}]
我的聚合代码目前是
rfidAttErrorSchema.aggregate([{
$match: condition
}, {
$group: {
_id: {
$month: "$error_date"
},
logs: {
$push: "$$ROOT"
}
}
}, {
$sort: {
'error_date': -1
}
}
],
function (err, data) {
if (err) {
return res.status(500).json({
result: err
});
}
console.log("data is now data", data);
res.json({
result: data
});
});
有人可以帮助我使用 $group 聚合管道两次或使用 MongoDB 的 MapReduce 来获得这个吗?非常感谢任何建议和帮助
您可以将 $group
替换为
{ $group: { _id: { month:{$month: "$error_date"}, error_type:"$error_type", }, data: { $push: "$$ROOT" } } },
{ $group: { _id: "$_id.month", logs: { $push: {error_type:"$_id.error_type",data:"$data" } } } }
对于预期格式,您可以使用 3.4.4 $arrayToObject
将密钥转换为命名 keys.Something,如
{ $group: { _id: { month:{$month: "$error_date"}, error_type:"$error_type", }, data: { $push: "$$ROOT" } } },
{ $group: { _id: "$_id.month", logs: { $push: {k:"$_id.error_type",v:"$data" } } } },
{ $addFields:{logs:{"$arrayToObject":"$logs"}}}
调整 $sort
以包括月份 {$sort: {'_id': -1}}
我收集了包含错误类型和错误日志日期的错误日志,因为 error_type 和 error_date.what 我需要执行的是来自特定月份类型的组错误日志,我使用 $group 作为聚合管道来按月或根据错误类型进行分组。想要获取的数据是这样的
[{
_id: 10, ///month wise group
logs: {
error_type1: ["error logs array of type 1"],
error_type2: ["error logs array of type 2"]
}
},
{
_id: 11, ///month wise group
logs: {
error_type1: ["error logs array of type 1"],
error_type2: ["error logs array of type 2"]
}
}]
我的聚合代码目前是
rfidAttErrorSchema.aggregate([{
$match: condition
}, {
$group: {
_id: {
$month: "$error_date"
},
logs: {
$push: "$$ROOT"
}
}
}, {
$sort: {
'error_date': -1
}
}
],
function (err, data) {
if (err) {
return res.status(500).json({
result: err
});
}
console.log("data is now data", data);
res.json({
result: data
});
});
有人可以帮助我使用 $group 聚合管道两次或使用 MongoDB 的 MapReduce 来获得这个吗?非常感谢任何建议和帮助
您可以将 $group
替换为
{ $group: { _id: { month:{$month: "$error_date"}, error_type:"$error_type", }, data: { $push: "$$ROOT" } } },
{ $group: { _id: "$_id.month", logs: { $push: {error_type:"$_id.error_type",data:"$data" } } } }
对于预期格式,您可以使用 3.4.4 $arrayToObject
将密钥转换为命名 keys.Something,如
{ $group: { _id: { month:{$month: "$error_date"}, error_type:"$error_type", }, data: { $push: "$$ROOT" } } },
{ $group: { _id: "$_id.month", logs: { $push: {k:"$_id.error_type",v:"$data" } } } },
{ $addFields:{logs:{"$arrayToObject":"$logs"}}}
调整 $sort
以包括月份 {$sort: {'_id': -1}}