Mongo DB通过一个API调用即可获取多个文档收集数据

时间:2019-03-10 02:37:47

标签: javascript node.js mongodb express

我有三个MongoDB函数,用于返回不同的集合。

    // mongo DB models/user
    module.exports.countUsers = function (callback) {
    User.findOne().where({ 'status': 1}).count(callback);
    }

   // mongo DB models/Cars
    module.exports.countCars = function (callback) {
    Car.findOne().where({ 'status': 1}).count(callback);
    }

   // mongo DB models/orders
    module.exports.countOrders = function (callback) {
    Order.findOne().where({ 'status': 1}).count(callback);
    }

我需要将所有这些数据合并到一个GET API调用中。

User = require('./models/user');
Cars = require('./models/cars');
Orders = require('./models/orders');

app.get('/userInfo', function(req, res) {
  let outPut = {}
  //get  data from  mongo db 
  User.countUsers(function(err, count) {
    //A
    console.log(count);
  outPut.coutUsers = count;
  });
  Cars.countCars(function(err, count) {
    //B
    console.log(count);
      outPut.coutCars = count;
  });
  Orders.countOrders(function(err, count) {
    //C
    console.log(count);
      outPut.coutOrders = count;
  });
  

  
  
  
  res.status(200);
  res.json(outPut);
});

在收集之前,必须将数据分配给打击对象。

outPut.coutUsers = '';
outPut.coutCars = '';
outPut.coutOrders = '';

我尝试了几种方法,但是没有运气。

它总是返回{},但是我需要类似{coutUsers:10,countCars:10,countOrders :10}

谢谢。

2 个答案:

答案 0 :(得分:0)

欢迎来到地狱(callback hell)。如果您更喜欢回调样式,则可以使用async library,它具有parallel函数,该函数将帮助您完成任务。

或者您可以将函数转换为Promise,然后可以通过Promise语法或async/await语法(推荐)使用它们。

什么是回调地狱?

User = require('./models/user');
Cars = require('./models/cars');
Orders = require('./models/orders');

app.get('/userInfo', function (req, res) {
  let outPut = {}
  //get  data from  mongo db 
  User.countUsers(function (err, count) {
    //A
    console.log(count);
    outPut.coutUsers = count;

    Cars.countCars(function (err, count) {
      //B
      console.log(count);
      outPut.coutCars = count;

      Orders.countOrders(function (err, count) {
        //C
        console.log(count);
        outPut.coutOrders = count;

        res.status(200);
        res.json(outPut);
      });
    });
  });
});

如果您使用的nodejs版本大于等于8.15的节点,则可以使用util.promisify将回调函数转换为Promise,然后可以将它们与Promise语法或async/await语法一起使用。

const promisify = require('util').promisify;

app.get('/userInfo', async function (req, res) {
  //get  data from  mongo db
  let coutUsersPromise = promisify(User.countUsers)();
  let coutCarsPromise = promisify(Cars.countCars)();
  let countOrdersPromise = promisify(Orders.countOrders)();

  try {
    let [coutUsers, coutCars, countOrders] = [ // Run the tasks collection of functions in parallel, without waiting until the previous function has completed.
      await coutUsersPromise,
      await coutCarsPromise,
      await countOrdersPromise,
    ];

    let outPut = {
      coutUsers: coutUsers,
      countCars: coutCars,
      countOrders: countOrders,
    };

    res.status(200);
    res.json(outPut);
  } catch(err) {
    // Error
    res.status(400);
    res.json(err);
  }
});

答案 1 :(得分:0)

我建议您将函数转换为Promise基本函数。

转换后,剩下的就是将如下所示的命令链接起来

function myFunction() {
  var cells = document.getElementById("myTable").rows[0].cells
  let sum = 0;
  for(let i = 0;i<cells.length;i++){
    sum += +cells[i].textContent 
  }
  document.getElementById("demo").innerHTML =  sum
}

您可以从以下位置找到有关Promise以及如何创建基于Promise的功能的更多信息: Mozilla LinkGoogle Link