Node.js 我想在nodejs mongodb列中计算三个字段,并需要按月对其进行分组
我想计算每个月的Node.js 我想在nodejs mongodb列中计算三个字段,并需要按月对其进行分组,node.js,arrays,mongodb,mongodb-query,aggregation-framework,Node.js,Arrays,Mongodb,Mongodb Query,Aggregation Framework,我想计算每个月的绿色、红色、琥珀色的数量(即:按月分组),如下所示: {_id:2,Green:20,Red:12,Amber:23} 假设_id表示月份(2:2月) 注意:-我正在从mongodb检索数据,日期列采用ISO日期类型格式 有人能帮我吗?演示- 尝试此查询: db.colors.aggregate([ { $group:{ _身份证:{ 月份:{$month:$Date}, 颜色:$Rag }, 计数:{$sum:1} } }, { $group:{ _id:“$\u i
绿色、红色、琥珀色的数量(即:按月分组),如下所示:
{_id:2,Green:20,Red:12,Amber:23}
假设_id表示月份(2:2月)
注意:-我正在从mongodb检索数据,日期列采用ISO日期类型格式
有人能帮我吗?演示-
尝试此查询:
db.colors.aggregate([
{
$group:{
_身份证:{
月份:{$month:$Date},
颜色:$Rag
},
计数:{$sum:1}
}
},
{
$group:{
_id:“$\u id.month”,
数组:{
$push:{
k:“$\u id.color”,
五:“$计数”
}
}
}
},
{
$replaceRoot:{
新根:{
$arrayToObject:{
$concatarray:[[{k:“\u id”,v:“$\u id”}],“$array”]
}
}
}
}
]);
问题中所附测试数据的输出:
{
“_id”:3,
"红":一,,
“琥珀”:14,
“绿色”:7
}
颜色中的数据
集合:
[
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“绿色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“绿色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“绿色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“绿色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“琥珀色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“绿色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“绿色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“绿色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“红色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“琥珀色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“琥珀色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“琥珀色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“琥珀色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“琥珀色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“琥珀色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“琥珀色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“琥珀色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“琥珀色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“琥珀色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“琥珀色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“琥珀色”
},
{
“_id”:ObjectId(“…”),
“日期”:ISODate(“2021-03-16T00:00:00.000+05:30”),
“破布”:“琥珀色”
}
]
谢谢,它运行得很好,而且我只想从it@hariram使用$sort和$limit@hariram若你们的日期实际上并不是一个字符串,就像你们最初的问题所暗示的那个样,那个么你们最好在节点中完成整个操作。
db.collection.aggregate({
"$project": {
color: 1,
month: {
"$substr": [ "$date", 0, { "$indexOfCP": [ "$date", "/" ] } // extract month from date string
]
}
}
},
{
"$group": {
"_id": { month: "$month", color: "$color" },
"count": { "$sum": 1 }
}
},
{
"$project": {
month: "$_id.month",
details: [ { color: "$_id.color", count: "$count" } ] // add color count to the array
}
},
{
$project: {
_id: 0,
month: 1,
color: {
$arrayToObject: { // get object from array like green: 1
$map: {
input: "$details", as: "pair", in: [ "$$pair.color", "$$pair.count" ]
}
}
}
}
},
{
"$group": {
"_id": "$month",
"color": { "$mergeObjects": "$color" } // merge all the colors
}
},
{
$replaceWith: {
$mergeObjects: [ { _id: "$_id" }, "$color" ] // bring color out of the object
}
})