Подтвердить что ты не робот

Mongoose, обновлять значения в массиве объектов

Есть ли способ обновить значения в объекте?

{
  _id: 1,
  name: 'John Smith',
  items: [{
     id: 1,
     name: 'item 1',
     value: 'one'
  },{
     id: 2,
     name: 'item 2',
     value: 'two'
  }]
}

Предположим, я хочу обновить имена и значения для элемента, где id = 2;

Я пробовал следующий w/mongoose:

var update = {name: 'updated item2', value: 'two updated'};
Person.update({'items.id': 2}, {'$set':  {'items.$': update}}, function(err) { ...

Проблема с этим подходом заключается в том, что он обновляет/устанавливает весь объект, поэтому в этом случае я теряю поле id.

Есть ли лучший способ в mongoose установить определенные значения в массиве, но оставить другие значения в одиночку?

Я также запросил только для Person:

Person.find({...}, function(err, person) {
  person.items ..... // I might be able to search through all the items here and find item with id 2 then update the values I want and call person.save().
});
4b9b3361

Ответ 1

Ты близко; вы должны использовать точечную нотацию при использовании оператора $ update, чтобы сделать это:

Person.update({'items.id': 2}, {'$set': {
    'items.$.name': 'updated item2',
    'items.$.value': 'two updated'
}}, function(err) { ...

Ответ 2

model.update({"_id": 1, "items.id": "2"}, 
{$set: {"items.$.name": "yourValue","items.$.value": "yourvalue"}})

Mongodb документ

Ответ 3

Для каждого документа оператор обновления $set может установить несколько значений, поэтому вместо замены всего объекта в массиве items, вы можете установить поля name и value объекта индивидуально.

{'$set':  {'items.$.name': update.name , 'items.$.value': update.value}}

Ответ 4

В Mongoose мы можем обновить значение массива, используя $set в нотации точка (.), До определенного значения следующим образом

db.collection.update({"_id": args._id, "viewData._id": widgetId}, {$set: {"viewData.$.widgetData": widgetDoc.widgetData}})

Ответ 5

В мангусте мы можем обновить, как простой массив

user.updateInfoByIndex(0,"test")

User.methods.updateInfoByIndex = function(index, info) ={
    this.arrayField[index]=info
    this.save()
}

Ответ 6

update(
    {_id: 1, 'items.id': 2},
    {'$set': {'items.$[]': update}},
    {new: true})

Вот документ о $ [].

Ответ 7

Следует помнить одну вещь: когда вы ищете объект в массиве на основе более чем одного условия, используйте $ elemMatch

Person.update(
   {
     _id: 5,
     grades: { $elemMatch: { grade: { $lte: 90 }, mean: { $gt: 80 } } }
   },
   { $set: { "grades.$.std" : 6 } }
)

вот документы

Ответ 8

Есть мангустовый способ сделать это.

const itemId = 2;
const query = {
  item._id: itemId 
};
Person.findOne(query).then(doc => {
  item = doc.items.id(itemId );
  item["name"] = "new name";
  item["value"] = "new value";
  doc.save();

  //sent respnse to client
}).catch(err => {
  console.log('Oh! Dark')
});