Javascript 如何使用MongoDB和express存储多个查询值?
我不熟悉使用平均值堆栈并尝试返回5星和4星评论数的值。我可以很好地检索到5颗星的数量,但是当我进行多次搜索时,我似乎遇到了麻烦,不知道如何设置它 您需要了解在执行异步操作时如何处理控制流的要点。 与php不同,当您运行异步操作时,函数执行不会停止。 为了完成您试图做的事情,第二个db调用需要位于第一个db调用的回调内部。试试这个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
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
}
});
});