2016-09-09 262 views
1

我有我的mogoose架構一些嵌套的屬性是這樣的:貓鼬更新嵌套值

const userSchemaValues = { 
 
    username: { 
 
     type: String, 
 
     required: [true, 'Username required'], 
 
     trim: true, 
 
     unique: true, 
 
     lowercase: true 
 
    }, 
 
    password: { 
 
     type: String, 
 
     required: [true, 'Password required'], 
 
     trim: true, 
 
     minlength: 8 
 
    }, 
 
    
 
... 
 
    
 
    prop: { 
 
     prop_1: String, 
 
     prop_2: String 
 
    } 
 
};

valuesToUpdate.prop = _.pick(req.body, 'prop_1', 'prop_2'); 
 
\t log.debug(JSON.stringify(valuesToUpdate)); 
 

 
\t User.update({_id: req.params.id}, {$set: valuesToUpdate}) 
 
\t \t .then((data) => { 
 
\t \t \t return res.json({message: data}); 
 
\t \t }) 
 
\t \t .catch(err => { 
 
\t \t \t log.error(err); 
 
\t \t \t return next({message: 'Error updating User.'}); 
 
\t \t });

但是,當我在與用戶做User.update({_id: req.params.id}, {$set: valuesToUpdate}) prop_1和_2用這樣的對象設置({"prop":{"prop_1": "somevalue"}),它不是l爲了支持什麼,它只是覆蓋它。我怎樣才能繞過這個?

+1

你能在這裏寫完整的查詢嗎? – abdulbarik

+0

我更新了我的問題。 –

回答

2

您發現需要包括要更新的屬性。另外,更新語句需要它的Positional Update Operator更改爲(離開我的頭):

valuesToUpdate.prop = _.pick(req.body, 'prop_1', 'prop_2'); 
    log.debug(JSON.stringify(valuesToUpdate)); 

    User.update({$and : [{_id: req.params.id}, {prop.prop1 : "%oldvalue%"}]}, {$set: { "prop.$.prop1" : "%newvalue""}}) 
     .then((data) => { 
      return res.json({message: data}); 
     }) 
     .catch(err => { 
      log.error(err); 
      return next({message: 'Error updating User.'}); 
     }); 

注意,位置更新僅更新第一次出現!

更新:重讀你的問題後,我看到道具不是一個數組......我很抱歉。 幸運的是這使得它更容易:)

您不需要領域存在於找到 爲集:{$設置:{「prop.prop1」:「NEWVALUE」} 同樣的位置更新不是必需的,因爲它不是一個數組。

這使得繼:

valuesToUpdate.prop = _.pick(req.body, 'prop_1', 'prop_2'); 
log.debug(JSON.stringify(valuesToUpdate)); 

User.update({_id: req.params.id}, {$set: { "prop.prop1" : "%newvalue%"}}) 
    .then((data) => { 
     return res.json({message: data}); 
    }) 
    .catch(err => { 
     log.error(err); 
     return next({message: 'Error updating User.'}); 
    }); 

UPDATE2:有關更新語句的更多信息。

由於評論的我會澄清更新命令。 如果要更新文檔中的字段,請使用$set命令。 這會更新一個或多個字段。 當你想更新多個領域,你都可以用類似的命令做到這一點:

$set : { "prop.prop1" : "newvalueforprop1", "prop.prop2" : "newvalueforprop2"} } 

但是當你使用上面的命令,並指定一個一個領域中,產生如下命令:

$set : { "prop.prop1" : "newvalueforprop1", "prop.prop2" : null} } 

這是關於如何創建更新命令的。當你不知道它是1還是2屬性時,你需要更新你的代碼,以便動態生成一個命令。 但你可以做的另一件事是讓貓鼬處理更新。

使用類似:

User.findById(req.params.id, function (err, user) { 
     if (err) { 
      handleError(err) 
     } 
     else { 
      //you should to some checking if the supplied value is present (!= undefined) and if it differs from the currently stored one 
      user.prop.prop1 = "your value"; 
      user.prop.prop1 = "2nd value" 

      user.save(function (err) { 
       if (err) { 
        handleError(err) 
       } 
       else { 
        res.json(user); 
       } 
      }); 
     } 
    }); 

希望它現在清楚了。

+0

對於我獲得的每個價值,我應該這樣做{prop。$。prop_1:「%oldvalue%」}嗎? 我問,因爲這是一個補丁路線,我不知道哪些值將被髮送更新。 –

+0

對不起,我正在更新我的答案;-),我把它放在我的頭上 – HoefMeistert

+0

對不起,我不熟悉這種查詢語法。但是我的IDE抱怨{$ set:{「prop。$「:」%newvalue「}}。對於prop。它期望得到一個」:「,並在$之後期望得到一個」;「? –