Я хотел бы отфильтровать массив на основе запроса мангуста. Однако я относительно новичок в node.js и асинхронном программировании. Я знаю, что Array.prototype.filter - это синхронная функция, а запросы мангуста - асинхронные.
При поиске на этом сайте я наткнулся на следующие два решения:
фильтрация массива с помощью функции, которая возвращает обещание - но это выглядит довольно сложно, и я еще не понимаю концепцию.
как дождаться результата запроса мангуста? - сначала это решение выглядит вполне понятным, поэтому я попробовал
вот мой пример кода, основанный на втором подходе:
exports.create = function(req, res) {
async.filter(req.body.data.entries, function(item, callback){
MyCollection.findOne({'_id': item.id}, function(err, doc) {
callback(err == null && doc != null);
});
},
function(results){
req.body.data = results
// default controller to create a document in Mongo DB
return controller.create(Model, req, res);
});
};
Однако, похоже, это не работает. results
не соответствует отфильтрованному списку, как описано в ответе, но точно соответствует результату логического выражения функции обратного вызова. Я также проверил это в текущей документации по async, чтобы узнать, изменилось ли что-нибудь в функции фильтр, но не заметил никаких изменений.
Я намерен отфильтровать неверные записи. Данные из req.body.data.entries
похожи на данные датчиков, которые могут содержать либо запись датчика, которая больше не может быть зарегистрирована, либо датчики из другой сети. Таким образом, поиски не зависят друг от друга.
Что ж, есть другой способ сделать это. Вместо получения строк в async. Вы можете отфильтровать все записи из базы данных. В mongodb есть понятие $ in. Вы можете использовать это для одновременного получения нескольких записей с определенными идентификаторами. В вашем случае вот пример
exports.create = function(req, res) {
var ids = []
req.body.data.entries.forEach(function (item) {
ids.push(item.id);
});
MyCollection.findOne({'_id': {$in: ids}}, function (err, docs) {
// here you have all your filter data
var myDocs = docs;
//Callback from here to return data
});
}
Спасибо, что помогли мне. Я наконец отфильтровал req.body.data.entries
, получив результат docs
.
не могли бы вы объяснить свою цель? Вы хотите выполнить поиск мангуста для каждого элемента в вашем массиве
req.body.data.entries
, и эти поиски не зависят друг от друга. это правильно?