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

How to store multiple query values with MongoDB and express?

本文关键字:查询 存储 express 何使用 MongoDB      更新时间:2023-09-26
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;
 });

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

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

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);
    });
});

}(;

所以看起来你正在反对JavaScript的异步性质。 在上述函数的情况下,它们不会按照您编写的顺序执行(您也不需要它们!(,因为它们是异步的。 在了解有关问题的更多信息时,很少有简单的解决方案可以让您继续前进。

解决方案 1:嵌套回调。 难以阅读。 此外,它会在触发第二个之前等待第一个完成,这可能会减慢所有速度。

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);
  });
});

解决方案 2:闩锁。 这样做的好处是并行发出请求,并且阅读起来不会那么糟糕。

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 
    }
  });
});

当然还有更多的解决方案,例如更好的查询或承诺。 也许在这里阅读更多关于异步 JavaScript 的信息,以获得更好的理解。