Javascript Mongoose-如何将结果保存到数组
我有一个mongodb查询,我想将结果保存到一个数组中。我还在查询外部定义了一个空数组Javascript Mongoose-如何将结果保存到数组,javascript,arrays,mongodb,mongoose,Javascript,Arrays,Mongodb,Mongoose,我有一个mongodb查询,我想将结果保存到一个数组中。我还在查询外部定义了一个空数组 var dietaryResults = []; for (var key in dietary){ Restaurant.find( { $text : { $search : dietary[key] } }, { score : { $meta: "textScore" } }
var dietaryResults = [];
for (var key in dietary){
Restaurant.find(
{ $text : { $search : dietary[key] } },
{ score : { $meta: "textScore" } }
).sort({ score : { $meta : 'textScore' } }).exec(function(err, results) {
for (var i in results){
dietaryResults.push(results[i]);
}
console.log(dietaryResults);
});
}
如果像上面那样在查询中执行
console.log(dietaryResults)
,我可以看到结果被推送到数组中。但是,如果我将console.log(dietaryResults)
放在数组之外(这是我想要的),它将打印一个空字符串。有人能解释这种行为并提出解决方案吗?谢谢。Restaurant.find是异步的
循环结束后正在执行insinde.exec部分函数
试一试
您将能够看到,“循环结束”日志将在“添加”日志之前打印。
若您需要数组中的所有结果,则应在回调中填充此数组。无法同步获取数据
有关回调和异步函数的更多信息,请参阅本文:
我建议一次搜索所有必需的数据,避免在循环内搜索单个回调,并在该回调内使用结果完成所有需要的操作
像这样的短信可能有用。如果没有,您应该搜索某种方法以在一个请求中获取所有数据
Restaurant.find(
{ $text : { $search : { $in: Object.values(dietary)} } },
{ score : { $meta: "textScore" } }
).sort({ score : { $meta : 'textScore' } }).exec(function(err, results) {
for (var i in results){
dietaryResults.push(results[i]);
}
//do stuff here;
});
Restaurant.find是异步的 循环结束后正在执行insinde.exec部分函数 试一试 您将能够看到,“循环结束”日志将在“添加”日志之前打印。 若您需要数组中的所有结果,则应在回调中填充此数组。无法同步获取数据 有关回调和异步函数的更多信息,请参阅本文: 我建议一次搜索所有必需的数据,避免在循环内搜索单个回调,并在该回调内使用结果完成所有需要的操作 像这样的短信可能有用。如果没有,您应该搜索某种方法以在一个请求中获取所有数据
Restaurant.find(
{ $text : { $search : { $in: Object.values(dietary)} } },
{ score : { $meta: "textScore" } }
).sort({ score : { $meta : 'textScore' } }).exec(function(err, results) {
for (var i in results){
dietaryResults.push(results[i]);
}
//do stuff here;
});
您需要回拨或承诺。您可以在**餐厅外使用。查找(** 这:
setTimeOut(函数s(){console.log(dietaryResults)},1000)
因为您需要学习异步函数。您需要回调或承诺。您可以在**餐厅之外使用。查找(** 这:
setTimeOut(函数s(){console.log(dietaryResults)},1000)
因为您需要学习异步函数。作为一种时尚,您无法确保.exec
回调将在for循环结束之前运行(并结束)。(您可以通过阅读有关
这样,dietaryResults
可以在任何其他位置为空(取决于查询速度)
,,
并且通过阅读有关的文章,更好地理解这个话题
目前,我不完全确定这是否可行,但这是你的方向:
var query = {...} // (enter your query here)
var dietaryResults = [];
Object.entries(diatery).map(async key => {
const results = await Restaurant.find(query).sort();
results.map(result => dietaryResults.push(result));
});
console.log(dietaryResults);
作为时尚,您不能确定.exec
回调是否会在for循环结束之前运行(并结束)。(您可以通过阅读有关
这样,dietaryResults
可以在任何其他位置为空(取决于查询速度)
,,
并且通过阅读有关的文章,更好地理解这个话题
目前,我不完全确定这是否可行,但这是你的方向:
var query = {...} // (enter your query here)
var dietaryResults = [];
Object.entries(diatery).map(async key => {
const results = await Restaurant.find(query).sort();
results.map(result => dietaryResults.push(result));
});
console.log(dietaryResults);
当我使用
bluebird
(这是一种Promise
)时,它就起作用了
var Promise = require('bluebird');
var mongoose = Promise.promisifyAll(require('mongoose'));
var promises = Restaurant.find({ $text : { $search : query } }, function(err, results) {
results.forEach(function(element) {
finalResults.push(element);
});
});
Promise.all(promises).then(function() {
console.log(finalResults);
}).error(console.error);
当我使用
bluebird
(这是一种Promise
)时,它就起作用了
var Promise = require('bluebird');
var mongoose = Promise.promisifyAll(require('mongoose'));
var promises = Restaurant.find({ $text : { $search : query } }, function(err, results) {
results.forEach(function(element) {
finalResults.push(element);
});
});
Promise.all(promises).then(function() {
console.log(finalResults);
}).error(console.error);
你能解释一下“但是如果我把console.log(dietaryResults)放在数组之外”是什么意思吗?你是说在回调之外还是嵌套for循环之外?我是说在这个
餐厅之外。find(
你能解释一下“但是如果我把console.log(dietaryResults)放在数组之外”是什么意思吗你是说在回调之外还是嵌套for循环之外?我是说在这个Restaurant.find之外(
这段代码与OPs有什么不同?解释一个解决方案!这不是关于NodeJS,而是关于Mongoosejs。@RandyCasburn我的代码将有助于理解部分代码的执行情况。作者将能够看到“循环结束”将在“添加”之前打印出来。因此,我正在解释行为,正如帖子中所要求的那样。我意识到这一点,但当他们一开始不理解异步操作时,如果你不解释你为他们做了什么,他们就不会知道。我试图避免对你的答案投反对票。请在你的答案中解释你的目的。@ŞkranEken告诉我哪里错了)我不认为我应该在这里解释所有异步概念。我已经发布了链接。@MichaelKapustey-回答得很好!这段代码与OPs有什么不同?解释一个解决方案!这不是关于NodeJS,而是关于Mongoosejs。@RandyCasburn我的代码在执行部分代码时将有助于理解。作者将能够看到“循环e”nd将在“添加”之前打印。因此,我正在解释行为,正如帖子中所要求的。我知道,但如果他们一开始不理解异步操作,如果你不解释你为他们做了什么,他们就不会知道。我试图避免对你的答案投反对票。请在你的答案中解释你的目的。@ŞkranEken告诉我(出了什么问题)我不认为我应该在这里解释所有异步概念。我已经发布了它的链接。@MichaelKapustey-很好的回答!我只想打印结果以供测试。实际上,我想把结果传递到其他地方,它仍然有效吗?我只想打印结果以供测试。实际上,我想通过t他去了别的地方,还这样吗?