JavaScript处理MongoDB聚合分页数据:日期值对比及描述字段生成
需求:为MongoDB聚合结果添加日期对比描述字段
原始聚合返回数据
const data = { docs: [ { Material_Description: 'NABATI VITAKRIM RSY 122g MT (24 pcs)', Plant: 'K105', Channel: 'MT', Material: '300973', expiredDate: 'January-2024', '2023-04-12': 124 }, { Material_Description: 'NEXTAR GANDUMKU RCO 22g GT(10pc x 12bal)', Plant: 'K105', Channel: 'GT', Material: '303923', expiredDate: 'October-2023', '2023-04-12': 1 } ], totalDocs: 2, limit: 1000, page: 1, totalPages: 1, pagingCounter: 1, hasPrevPage: false, hasNextPage: false, prevPage: null, nextPage: null }
近7天日期列表生成代码
const dateLists = Array.from({ length: 7 }, (_, index) => { const local = new Date(); local.setDate(local.getDate() - index); return local.toLocaleDateString("en-SE", { timeZone: "Asia/Jakarta", }); });
当前处理结果
已成功为每条数据补充近7天的日期字段(默认值为0),但未实现相邻日期值对比生成描述字段,当前结果如下:
{ "docs": [ { "Material": "300973", "Material_Description": "NABATI VITAKRIM RSY 122g MT (24 pcs)", "Plant": "K105", "Channel": "MT", "expiredDate": "January-2024", "2023-04-12": 124, "2023-04-13": 0, "2023-04-14": 0, "2023-04-15": 0, "2023-04-16": 1, "2023-04-17": 0, "2023-04-18": 0 }, { "Material": "303923", "Material_Description": "NEXTAR GANDUMKU RCO 22g GT(10pc x 12bal)", "Plant": "K105", "Channel": "GT", "expiredDate": "October-2023", "2023-04-12": 1, "2023-04-13": 0, "2023-04-14": 0, "2023-04-15": 0, "2023-04-16": 0, "2023-04-17": 0, "2023-04-18": 0 } ], "totalDocs": 2, "limit": 1000, "page": 1, "totalPages": 1, "pagingCounter": 1, "hasPrevPage": false, "hasNextPage": false, "prevPage": null, "nextPage": null }
期望结果
需为每个日期字段添加对应的Keterangan_N描述字段,规则:
- 第一个日期的描述固定为
No Data - 后续日期与前一个日期对比:
- 当前值 < 前值:
Berkurang - 当前值 = 前值:
Sama - 当前值 > 前值:
Bertambah
- 当前值 < 前值:
示例格式:
"docs": [ { "Material": "300973", "Material_Description": "NABATI VITAKRIM RSY 122g MT (24 pcs)", "Plant": "K105", "Channel": "MT", "expiredDate": "January-2024", "2023-04-12": 124, "Keterangan_1":"No Data", "2023-04-13": 0, "Keterangan_2":"Berkurang", "2023-04-14": 0, "Keterangan_3":"Sama", "2023-04-15": 0, "Keterangan_4":"Sama", "2023-04-16": 1, "Keterangan_5":"Bertambah", "2023-04-17": 0, "Keterangan_6":"Berkurang", "2023-04-18": 0, "Keterangan_7":"Sama", } ]
解决方案
通过遍历日期列表和文档数据,先补充缺失日期字段,再对比相邻日期值生成描述字段,代码如下:
// 生成近7天日期列表 const dateLists = Array.from({ length: 7 }, (_, index) => { const local = new Date(); local.setDate(local.getDate() - index); return local.toLocaleDateString("en-SE", { timeZone: "Asia/Jakarta", }); }); // 处理每个文档 data.docs = data.docs.map(doc => { // 补充所有缺失的日期字段,默认值为0 dateLists.forEach(date => { if (!doc.hasOwnProperty(date)) { doc[date] = 0; } }); // 生成对应的Keterangan字段 dateLists.forEach((date, index) => { const keteranganKey = `Keterangan_${index + 1}`; if (index === 0) { doc[keteranganKey] = "No Data"; } else { const prevDate = dateLists[index - 1]; const currentValue = doc[date]; const prevValue = doc[prevDate]; if (currentValue < prevValue) { doc[keteranganKey] = "Berkurang"; } else if (currentValue > prevValue) { doc[keteranganKey] = "Bertambah"; } else { doc[keteranganKey] = "Sama"; } } }); return doc; }); console.log(JSON.stringify(data, null, 2));
代码说明
- 补充日期字段:遍历日期列表,为每个文档添加缺失的日期键,默认值设为0。
- 生成描述字段:
- 第一个日期对应的描述固定为
No Data - 从第二个日期开始,获取前一个日期的值进行对比,根据差值设置对应的描述文本。
- 第一个日期对应的描述固定为
内容的提问来源于stack exchange,提问作者Josea Samoa
相关产品推荐
相关产品推荐

