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
  }
})