Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose-如何将结果保存到数组_Javascript_Arrays_Mongodb_Mongoose - Fatal编程技术网

Javascript Mongoose-如何将结果保存到数组

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" } }

我有一个mongodb查询,我想将结果保存到一个数组中。我还在查询外部定义了一个空数组

       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他去了别的地方,还这样吗?