2016-06-12 104 views
0

我不知道我需要怎麼做我想要做什麼。我的模式是這樣的:搜索值的數組對貓鼬

var userObj = mongoose.Schema({ 
    'timestamp':{type: Date, default: Date.now()}, 
    'password':{type:String, required:true}, 
    "userName":{type:String, required:true, unique:true} 
}); 

    var groupSchema = mongoose.Schema({ 
    'creator':String, 
    'members':Array, //contains the _id of users added to the group 
    'admins':Array, 
    'name':String, 
    'timestamp':{type: Date, default: Date.now()}, 
    'description':String 
    }); 

其中成員架構有一個包含用戶ID的數組。我需要從組文檔中獲取數組並獲取用戶名。

我開始了使用貓鼬.find()方法和推動的結果到一個數組環 - 但正如我所期望的陣列是回調函數的範圍的空外。

 var dat = []; 
    for(var i = 0; i<passed.payload.length;i++){ 
     user.find({'_id':passed.payload[i]},'userName',function(err,result){ 
     if(err){ 
      console.log(err); 
     }else{ 
      dat.push(result); 
     } 
     }) 

    } 
    //res.send(dat) 

    console.log(dat); 

我不知道如何做到這一點 - 我考慮過使用.find拉所有用戶ID,然後運行該陣列即可返回只匹配。這似乎是浪費資源拉全用戶表,然後測試它。

是否有一個更復雜的查詢,我可以用貓鼬使用_ids數組來匹配這樣的數據?

回答

0

你外面得到一個空數組for循環的原因的鏈接是貓鼬的查詢都是異步的(在你的情況User.find()),因此for循環會前獴查詢是完成完成後形成空陣列。您可以通過承諾或一些NPM模塊像async處理這個問題。

但是,由於@karlkurzer建議您不需要在此處循環訪問數組,因此可以改爲使用$inoperator。以上代碼可以替換爲:

user.find({'_id': {$in: passed.payload}},'userName',function(err,results){ 
    if(err){ 
     console.log(err); 
    }else{ 
     console.log(results); //You will get array of user names here 
    } 
    }); 

並且您應該獲得與您在回調函數中傳遞的ID關聯的userNames數組。

希望這會有所幫助!