在 Express JS 和 Node JS 中使用 Reduce 方法
Using Reduce Method with Express JS and Node JS
我正在尝试从 MongoDB 获取数据并构造 APIs 以将数据发送到我的 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, 4, 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 的聚合函数。只能从数据库中提取原始数据,自己操作
请帮忙。
首先,欢迎来到 Whosebug
正如我在评论中所写,我建议您利用 MongoDB 聚合 API 的惊人力量,并在服务器本身中执行所有这些工作,这样它不仅超快,但通过线路导航的数据更少,后端不再处理。
如果您无法将此作为 MongoDB 聚合(如您标记 Mongoose、they have a whole section about it), you can maybe use Lodash 或 Array.reducer(),取决于您想要的输出方式。 .. 这是一个例子
const data = [
{
"code": "FORM",
"createdDate": "2021-05-17T07:09:29.740Z"
},
{
"code": "FORM",
"createdDate": "2021-05-17T06:49:34.714Z"
},
{
"code": "FORM",
"createdDate": "2021-01-17T06:49:34.714Z"
},
{
"code": "FORM",
"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>
我正在尝试从 MongoDB 获取数据并构造 APIs 以将数据发送到我的 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, 4, 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 的聚合函数。只能从数据库中提取原始数据,自己操作
请帮忙。
首先,欢迎来到 Whosebug
正如我在评论中所写,我建议您利用 MongoDB 聚合 API 的惊人力量,并在服务器本身中执行所有这些工作,这样它不仅超快,但通过线路导航的数据更少,后端不再处理。
如果您无法将此作为 MongoDB 聚合(如您标记 Mongoose、they have a whole section about it), you can maybe use Lodash 或 Array.reducer(),取决于您想要的输出方式。 .. 这是一个例子
const data = [
{
"code": "FORM",
"createdDate": "2021-05-17T07:09:29.740Z"
},
{
"code": "FORM",
"createdDate": "2021-05-17T06:49:34.714Z"
},
{
"code": "FORM",
"createdDate": "2021-01-17T06:49:34.714Z"
},
{
"code": "FORM",
"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>