Javascript 如何使用MongoDB和express存储多个查询值?

Javascript 如何使用MongoDB和express存储多个查询值?,javascript,mongodb,express,mean,Javascript,Mongodb,Express,Mean,我不熟悉使用平均值堆栈并尝试返回5星和4星评论数的值。我可以很好地检索到5颗星的数量,但是当我进行多次搜索时,我似乎遇到了麻烦,不知道如何设置它 您需要了解在执行异步操作时如何处理控制流的要点。 与php不同,当您运行异步操作时,函数执行不会停止。 为了完成您试图做的事情,第二个db调用需要位于第一个db调用的回调内部。试试这个 app.get('/ratings', function (req, res){ db.database.find({rating:5}).count(functi

我不熟悉使用平均值堆栈并尝试返回5星和4星评论数的值。我可以很好地检索到5颗星的数量,但是当我进行多次搜索时,我似乎遇到了麻烦,不知道如何设置它

您需要了解在执行异步操作时如何处理控制流的要点。 与php不同,当您运行异步操作时,函数执行不会停止。 为了完成您试图做的事情,第二个db调用需要位于第一个db调用的回调内部。试试这个

app.get('/ratings', function (req, res){ 
 db.database.find({rating:5}).count(function(err, doc) {
  review.FiveStarCount=doc;
 });        
 db.database.find({rating:4}).count(function(err, doc) {
  review.FourStarCount=doc;
 });

})

因此,您似乎在违背JavaScript的异步特性。在上述函数的情况下,它们不会按照您编写的顺序执行,您也不会想要它们!因为它们是异步的。在你进一步了解问题的同时,很少有简单的解决方案可以让你继续前进

解决方案1:嵌套回调。难以阅读。此外,它会等待第一个任务完成,然后再启动第二个任务,这可能会减慢速度

app.get('/ratings', function (req, res, next) { 
db.database.find({rating:5}).count(function(err, doc) {
    // always handle error first
    if (err) {
        return next(err);
    }

    if (doc) {
        review.FiveStarCount = doc;
    }

    db.database.find({rating:4}).count(function(err, doc) {
        if (err) {
            return next(err);
        }

        if (doc) {
            review.FourStarCount = doc;
        }

        console.log(review.FiveStarCount, review.FourStarCount);
    });
});
解决方案2:闩锁。这样做的好处是可以并行地发出请求,而且读起来也不那么糟糕

app.get('/ratings', function(req, res) { 
  var review = {};
  db.database.find({rating:5}).count(function(err, doc) {
  review.FiveStarCount = doc;

  db.database.find({rating:4}).count(function(err, doc) {
    review.FourStarCount = doc;

    // DO something with data
    res.json(review);
  });
});

当然还有更多的解决方案,比如更好的查询或承诺。也许可以阅读更多关于异步JavaScript的内容,以便更好地理解。

我似乎遇到了麻烦,您能详细说明一下吗?虽然我看不出您的代码。.find是一个异步函数-回调不会按照您编写的顺序执行,而是在任意时间执行。如果不使用闩锁、承诺或嵌套回调,则无法同时检索这两者。请在第二个解决方案中共享更多代码,如果其他解决方案尚未完成,该怎么办?
app.get('/ratings', function(req, res) {
  var review = {};

  db.database.find({rating:5}).count(function(err, doc) {
    review.FiveStarCount=doc;

    if (review.FiveStarCount && review.FourStarCount) {
      // DO something here
      // Will only execute if the other has finished 
    }
  });        

  db.database.find({rating:4}).count(function(err, doc) {
    review.FourStarCount=doc;

    if (review.FiveStarCount && review.FourStarCount) {
      // DO something here
      // Will only execute if the other has finished 
    }
  });

});