繁体   English   中英

在 Express JS 和 Node JS 中使用 Reduce 方法

[英]Using Reduce Method with Express JS and Node JS

我正在尝试从 MongoDB 获取数据并构建 API 以将数据发送到我的 React 应用程序。 这是我的路由器和 app.js 代码:

应用程序.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"
  },
  ...
]

我想要做的是添加一个额外的 function 来计算每个月代码 =“FORM”的条目数,预期的 output 将是:

[
 {
  "January": 1,
  "February: 4,
  "March": 6,
  "April": 4,
  "May": 45,
  ...
 }
]

我尝试使用 reduce 方法添加 function 但我不确定应该将它放在我的代码中的哪个位置

        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 中插入减少 function 以实现我的目标。 将其插入到 route.get function 时出现错误。

仅供参考:由于访问权限问题,我无法使用 MongoDB 的聚合 function。 我只能从数据库中提取原始数据并自己进行操作。

请帮忙。

首先,欢迎来到 StackOverflow

正如我在评论中所写的那样,我建议您利用 MongoDB 聚合 API 的惊人功能并在服务器本身中执行所有这些工作,因此它不仅速度超快,而且通过线路导航的数据更少,而且没有在后端进行更多处理。

如果您无法将其作为 MongoDB 聚合(当您标记为 Mongoose 时,他们有一个完整的部分),您可以使用Lodash或 Array.reducer(),这取决于您想要 Z783E6221F6393D11...这是一个例子

 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM