2017-01-13 64 views
0

首先,我已閱讀並嘗試mongoose-and-partial-select-update後的解決方案。 但是,當我嘗試使用傳統風格時,查詢將起作用。無法通過貓鼬更新單個房產

我的架構:

var userSchema = mongoose.Schema({ 
    local: { 
     email: { 
      type: String, 
      index: { 
       unique: true, 
       dropDups: true 
      } 
     }, 
     password: String, 
     displayName: String, 
     avatar: { 
      type: String, 
      default: "./img/user.png" 
     }, 
     role: { 
      type: String, 
      default: "student" 
     }, 
     ask_history: [ 
      { 
       question_id: { 
        type: mongoose.Schema.Types.ObjectId, 
        ref: 'questionAnswer' 
       }, 
       favorite: Boolean, 
       ask_time: Date 
      } 
     ], 
     interest: [String] 
    } 
}) 

工作更新功能:

User.findById(id, function(err, User) { 
      if (err) { 
       throw done(err); 
      } 
      if (!User) { 
       return; 
      } 
      User.local.role = "admin"; 
      User.save(function(err, updatedUser) { 
       if (err) { 
        throw err 
       } else { 
        //good 
       } 
      }) 
     }); 

但是,如果我這樣做:

User.update({_id : id}, 
    {$set{ 
     local:{role:"admin"} 
    } 
    },function(...){...} 
}); 

上面的代碼將覆蓋用戶爲:

{ 
    _id : "...", 
    local: { 
      role : "admin" 
     } 
} 

我讀過$會使更新只改變屬性,我做錯了?

回答

1

位置操作符$與一系列子文檔一起工作。

你的情況,你有一個單獨的子文檔,所以下面應該工作:

User.update({_id : id}, 
    { $set 
     { 
      "local.role": "admin" 
     } 
    }, function(...){...} 
}); 
+0

謝謝你,你的解決方案的工作,你能告訴我什麼區別,當我使用$組:{「本地。角色「:」admin「} vs $ set:{local:{role:」admin「}}? –

+0

以下是[documentation](https://docs.mongodb.com/manual/reference/operator/update/set/)所說的:** $ set運算符表達式具有以下形式:{$ set:{,...}}。 *要在嵌入式文檔或數組中指定,請使用[點符號](https://docs.mongodb.com/manual/core/document/#document-dot-notation)。***希望回答你的問題。 –