2015-07-13 18 views
1

將新元素正確推送到mongodb數組,我需要將2個元素添加到屬於集合'users'的數組'roles'中。 我正在使用本地mongodb驅動程序。 這裏是我的代碼:如何在我的節點應用中使用node.js

MongoClient.connect(url, function (err, db) { 
      if (err) { 
       console.log('Unable to connect to the mongoDB server. Error:', err); 
      } else { 
       console.log('Connection established to', url); 

       var collection = db.collection('users'); 

       var roles = req.body.requestedRoles.split(','); 

       roles.forEach(function(role){ 
        collection.update(
         { 
          email: req.body.userEmail 
         }, 
         { 
          $push: { roles: role } 
         }, 
         {upsert: true}, 
         function(err, result) { 
          if (err) { 
           console.log('err: ' + err); 
          } 
          else { 
           console.log('update result: ' + result); 
          } 
         } 
        ); 
       }); 

       collection.update(
        { 
         email: req.body.userEmail 
        }, 
        { 
         $push: { roles: req.body.requestedRoles } 
        }, 
        {upsert: true}, 
        function(err, result) { 
         if (err) { 
          console.log('err: ' + err); 
         } 
         else { 
          console.log('update result: ' + result); 
         } 
        } 
       ); 
      } 
     }); 

req.body.requestedRoles包含「角色1,角色2」

運行此代碼時,我結束了以下的(而不是2)3角色:'role-1','role-2','role-1,role-2'

顯然,我不需要第三個條目。 我可以改變什麼來避免這種情況?

回答

1

您在roles.forEach之後有一個collection.update(...)以及forEach回調中的一個。這是推動role-1,role-2,所以刪除它!

1

。假定的第一行代碼在這裏其實準確「分裂」的數組,那麼你可以添加$each修飾符$push

var roles = req.body.requestedRoles.split(','); 
    collection.update(
     { "email": req.body.userEmail }, 
     { "$push": { "roles": { "$each": roles } } }, 
     { "upsert": true }, 
     function(err, result) { 
      if (err) { 
       console.log('err: ' + err); 
      } 
      else { 
       console.log('update result: ' + result); 
      } 
     } 
    ); 

這避免了需要控制與回調環路簡單地添加多個元素添加到數組中,因爲它可以在單個操作中完成。

還有$pushAll這確實與「奇」數組元素的參數,如[1,2,3]工作,但是這通常是considerred贊成使用$each,這是更加的「過時」的MongoDB的2.4(相當現在的舊版本)的有能力的選擇

另請注意,.update()不會返回已修改的文檔,而只是告訴您什麼是已更新或未更新。要返回現代驅動程序版本中需要.findOneAndUpdate()的文檔或.findAndModify()這是該操作(以及其他類似操作)的一般調用。