mongoose : find data by looping on an array of models

后端 未结 1 1866
北恋
北恋 2020-12-12 05:17

i\'m getting stuck on an asynchronous algorithm :

I\'ve an array of mongoose models :

var allRefDatasSchemas = {
  RefAllotement: mongoose.model(\'Re         


        
相关标签:
1条回答
  • 2020-12-12 05:23

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

    Sample Working code similar to what you required. Another 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)
    });
    

    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
        ]
    }
    
    0 讨论(0)
提交回复
热议问题