Mongoose: find data by looping over an array of models

I am stuck on an asynchronous algorithm:

I have an array of mongoose models:

var allRefDatasSchemas = { RefAllotement: mongoose.model('RefAllotement', RefDataSchema), RefModeleConstructeur: mongoose.model('RefModeleConstructeur', RefDataSchema), RefTypeKit: mongoose.model('RefTypeKit', RefDataSchema), RefTypeUtilisation: mongoose.model('RefTypeUtilisation', RefDataSchema), }; 

I would like to grab all the elements of each collection and put them in an array or something like that. If I do this , the find keyword of this callback does not apply to the current model, so it’s impossible for me to find out which elements of the model belong

 var results = {}; for (var model in allRefDatasSchemas) { allRefDatasSchemas[model].find(function(err, data) { // I'd like to do something like that : // but this.modelName is null, because it isn't the model // on which the find is done. results[this.modelName] = data; // if I use "model" variable, it doesn't work, because asynchronous callback }); } 

I also tried the async library without success, because I always return to the same problem: it is impossible to find out which model is executing to find the query inside the callback. Also in then if I use promises.

Please help me :) How would you do this?

EDIT model.find calls query.find, query.find calls mquery.find. A callback is called in mquery.find, losing this link at this time: this._collection.find (conds, options, utils.tick (callback)); / EDIT

+1
mongodb mongoose
source share
1 answer

Please check this piece of code, I made a working sample of what you need. Please check the comments in the code for a better understanding.

Sample working code similar to what you need. Still ref ques for using async with mongoose.

 /* * Object to store all models */ var allRefDatasSchemas = { RefAllotement: mongoose.model('RefAllotement', RefDataSchema), RefModeleConstructeur: mongoose.model('RefModeleConstructeur', RefDataSchema), RefTypeKit: mongoose.model('RefTypeKit', RefDataSchema), RefTypeUtilisation: mongoose.model('RefTypeUtilisation', RefDataSchema), }; /* * need an array to run all queries one by one in a definite order using async waterfall mwthod */ var arr = []; for(each in allRefDatasSchemas) { arr.push(each); } /* * Callback function for initiation of waterfall */ var queue = [ function(callback) { // pass the ref array and run first query by passing starting index - 0 callback(null, arr, 0) } ]; /* * Object to store result of all queries */ var finalResult = {}; /* * Generic Callback function for every dynamic query */ var callbackFunc = function(prevModelData, currentIndex, callback) { allRefDatasSchemas[arr[currentIndex]].find(function(err, result) { if(err) { console.log(err) } else { // Your Query // // I'd like to do something like that : // but this.modelName is null, because it isn't the model // on which the find is done. // arr[currentIndex] will point to // RefAllotement, RefModeleConstructeur etc. as you required finalResult[arr[currentIndex]] = result // send current result to next interation if required or you can skip // and increment the currentIndex to call next query callback(null, result, currentIndex + 1) } }) } /* * Add callback function for every dynamic query */ for(each in allRefDatasSchemas) { queue.push(callbackFunc); } /* * Run all dynamic queries one by one using async.js waterfall method */ async.waterfall(queue, function (err, result) { // Final object with result of all the queries console.log('finish', finalResult) }); 

the output will be in this format

 finish { RefAllotement:[ // Result of RefAllotement query ], RefModeleConstructeur:[ // Result of RefModeleConstructeur query ], RefTypeKit:[ // Result of RefTypeKit query ], RefTypeUtilisation:[ // Result of RefTypeUtilisation query ] } 
+3
source share

All Articles