首页 > 解决方案 > 使用对象键中的日期对结果进行分组,并且只计算结果

问题描述

您好,我很难使用 MongoDB 或 Javascript 获得这种复杂的回报。希望有人能教我如何获得这个回报。

管理员

按 id 分组结果

用户 展平结果

这是数据示例。

let user = [
    {
  _id: 123,
  name: 'John',
  createdAt: "2015-08-12T00:00:00Z"
  },
  {
  _id: 124,
  name: 'Jane',
  createdAt: "2015-09-12T00:00:00Z"
  },
  {
  _id: 125,
  name: 'Robert',
  createdAt: "2015-09-12T00:00:00Z"
  },
  {
  _id: 126,
  name: 'Samson',
  createdAt: "2016-11-12T00:00:00Z"
  }
]

预期结果

用户

[
{
 "15-8": 1 //yyyy-mm: number of data for the month of august
},
{
 "15-9": 2
},
{
 "16-11": 1
}
]

行政

[
    {
     "15-8": 
   {
    _id: 123,
    count: 1
   }
    },
    {
     "15-9": {
     _id: 124,
     count: 1,
   },{
     _id: 125,
     count: 1
    },
    {
     "16-11": {
     _id: 126,
     count: 1
     }
    }
    ]

标签: javascriptnode.jsmongodbmongoose

解决方案


  1. 您应该具有从以格式结果key命名的日期字符串中获取的功能getKeyFromDateYY-MM

  2. 例如,循环user数据以聚合您的数据reduce

let user = [
    {
      _id: 123,
      name: 'John',
      createdAt: "2015-08-12T00:00:00Z"
    },
    {
      _id: 124,
      name: 'Jane',
      createdAt: "2015-09-12T00:00:00Z"
    },
    {
      _id: 125,
      name: 'Robert',
      createdAt: "2015-09-12T00:00:00Z"
    },
    {
      _id: 126,
      name: 'Samson',
      createdAt: "2016-11-12T00:00:00Z"
    }
];

const getKeyFromDate = (dateString) => {
  var date = new Date(dateString);
  var year = date.getFullYear().toString().substr(2, 3);
  var month = date.getMonth() + 1;
  return `${year}-${month}`; // YY-MM
};

var result = user.reduce((acc, {createdAt}) => {
  var key = getKeyFromDate(createdAt);
  acc[key] = acc[key] || {[key]: 0}; //Also use shortcut like: acc[key] ??= {[key]: 0};
  acc[key][key] += 1;
  return acc; 
  
}, {});
console.log(Object.values(result));

for..of如果您不熟悉也可以使用.reduce

var result2 = {};
for(let {createdAt} of user){
  var key = getKeyFromDate(createdAt);
  result2[key] = result2[key] || {[key]: 0};
  result2[key][key] += 1;
}
console.log(Object.values(result2));

推荐阅读