[英]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.