在 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>