如何解决在 Express JS 和 Node JS 中使用 Reduce 方法
我正在尝试从 MongoDB 获取数据并构建 API 以将数据发送到我的 React 应用程序。这是我的路由器和 app.js 代码:
app.js
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
app.use(bodyParser.json());
//import routes
const apiRoute = require('./routes/api');
app.use('/api',apiRoute);
//MONGODB CONNECTION
mongoose.connect('mongodb://**[MY LINK TO MONGODB]** },() => console.log('connected to real DB')
);
//LISTENING TO PORT
app.listen(5000);
api.js
const express = require('express');
const router = express.Router();
const Api = require('../models/Api');
router.get('/',async (req,res) => {
try{
const first_api = await Api.find({ code: 'FORM',createdDate: {
$gte: new Date(Date.UTC(2021,4,16)),//since 01/05/2021
$lte: new Date(Date.UTC(2021,31))}},//until 31/05/2021
['createdDate'])
.sort( { createdDate: -1 });
res.json(first_api);
console.log(first_api);
}catch (err) {
res.json({message: err});
}
});
数据“first_api”的格式如下:
[
{
"code":"FORM","createdDate":"2021-05-17T07:09:29.740Z"
},{
"code":"FORM","createdDate":"2021-05-17T06:49:34.714Z"
},...
]
我想要做的是添加一个额外的函数来计算每月代码 = "FORM" 的条目数,预期输出为:
[
{
"January": 1,"February: 4,"march": 6,"April": 4,"May": 45,...
}
]
我尝试使用 reduce 方法添加一个函数,但我不确定应该将它放在代码中的什么位置
var string1 = JSON.stringify(first_api);
var result = string1.reduce((r,{ createdDate }) => {
var key = new Date(createdDate).getMonth() +1;
r[key] = (r[key] || 0) + 1;
return result;
},{});
我只想在每次调用路由器时将结果作为 API 发送到我的 React 前端。我不知道在 api.js / app.js 中插入 reduce 函数的位置以实现我的目标。将其插入到 route.get 函数时发生错误。
仅供参考:由于访问权限问题,我无法使用 MongoDB 的聚合函数。我只能从数据库中提取原始数据并自行操作。
请帮忙。
解决方法
首先,欢迎来到 StackOverflow ?
正如我在评论中所写的那样,我建议您利用 MongoDB Aggregate API 的惊人功能并在服务器本身中执行所有这些工作,这样不仅速度超快,而且通过连线,后端不再处理。
如果您无法将其作为 MongoDB 聚合(因为您标记了 Mongoose,they have a whole section about it),您可以使用 Lodash 或 Array.reducer(),这取决于您想要的方式输出...这是一个例子
const data = [
{
"code": "FORM","createdDate": "2021-05-17T07:09:29.740Z"
},{
"code": "FORM","createdDate": "2021-05-17T06:49:34.714Z"
},"createdDate": "2021-01-17T06:49:34.714Z"
},"createdDate": "2021-03-17T06:49:34.714Z"
}
];
console.log('lodash',_.chain(data)
.groupBy(x => ((new Date(x.createdDate)).toLocaleString('default',{ month: 'long' })))
.toPairs()
.map(x => ({ [x[0]]: x[1].length }))
.value()
);
console.log('reducer',data.reduce((acc,cur) => {
const month = (new Date(cur.createdDate)).toLocaleString('default',{ month: 'long' });
acc[month] ? acc[month] += 1 : acc[month] = 1;
return acc;
},{})
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js"></script>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。