簡體   English   中英

貓鼬-如何將結果保存到數組

[英]Mongoose - How to save results to an array

我有一個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部分。

嘗試

 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('added');
        });
    }
 console.log('loop end');

您將看到,“循環結束”日志將在“添加”日志之前打印。 如果需要數組中的所有結果,則應在回調中填充此數組。 無法同步獲取數據。

有關回調和異步函數的更多信息,請查看本文: https : //www.tutorialspoint.com/nodejs/nodejs_callbacks_concept.htm

我建議一次搜索所有必需的數據,避免在循環內搜索單個回調,並在該回調內執行結果所需的一切。

這樣的事情可能會起作用。 如果不是,您應該尋找某種方法來在一個請求中獲取所有數據

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

當我使用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);

您需要回調或Promise。您可以在** Restaurant.find(** this: setTimeOut(function s(){console.log(dietaryResults)},1000)

因為您需要學習異步功能。

javascript異步.exec來看,您無法確定.exec回調將在for循環結束之前運行(並結束)。 (通過閱讀有關事件循環,您可以對此主題有更好的理解)

這樣, dietaryResults在其他任何地方都可以為空(取決於查詢速度)。

您可以閱讀有關將承諾與貓鼬和節點一起使用的更多信息,以確保dietaryResults包含完整的結果 ,並且通過閱讀有關Node事件循環的信息 ,可以更好地理解該主題。

目前,我還不確定這是否行得通-但這就是您的方向:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM