2016-09-09 3 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 ooking для того, что находится в prop, он просто перезаписывает его. Как я могу обойти это?

+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»: «новое_значение»} Кроме того, позиционного обновления не требуется, потому что это не массив.

Это делает следующее:

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 свойства, вам необходимо обновить код, чтобы он генерировал команду динамически. Но еще одна вещь, которую вы могли бы сделать, это позволить mongoose обрабатывать обновление.

использовать что-то вроде:

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. он ожидает«: », а после $ он ожидает«; »? –

Смежные вопросы