131

オブジェクトの値を更新する方法はありますか?

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

id = 2; のアイテムの名前と値のアイテムを更新したいとしましょう。

私はマングースで次のことを試しました:

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

このアプローチの問題は、オブジェクト全体を更新/設定するため、この場合は id フィールドが失われることです。

マングースで特定の値を配列に設定し、他の値をそのままにしておくより良い方法はありますか?

また、 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().
});
4

12 に答える 12

215

あなたは近くにいます。$これを行うには、 update 演算子を使用する際にドット表記を使用する必要があります。

Person.update({'items.id': 2}, {'$set': {
    'items.$.name': 'updated item2',
    'items.$.value': 'two updated'
}}, function(err) { ...
于 2013-03-28T20:54:08.183 に答える
20

それを行うためのマングースの方法があります。

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')
});
于 2019-07-16T17:12:31.373 に答える
6

ドキュメントごとに、 update オペレーターは複数の値を設定$setできるため、配列内のオブジェクト全体を置き換えるのではなく、オブジェクトのおよびフィールドを個別に設定できます。itemsnamevalue

{'$set':  {'items.$.name': update.name , 'items.$.value': update.value}}
于 2013-03-28T20:55:29.293 に答える
4

以下は、オブジェクトの配列の値をより動的に更新する方法の例です。

Person.findOneAndUpdate({_id: id}, 
{ 
  "$set": {[`items.$[outer].${propertyName}`]: value} 
},
{ 
  "arrayFilters": [{ "outer.id": itemId }]
},
function(err, response) {
  ...
})

arrayFiltersそのようにすることで、次のように追加の位置演算子を追加することで、ネストされた配列のさらに深いレベルを更新できることに注意してください。

"$set": {[`items.$[outer].innerItems.$[inner].${propertyName}`]: value} 

"arrayFilters":[{ "outer.id": itemId },{ "inner.id": innerItemId }]

より多くの使用法は、公式ドキュメントにあります。

于 2020-04-29T03:52:12.990 に答える
0

うまく機能する他のソリューションを試してみましたが、彼らの答えの落とし穴は、既存のフィールドのみが更新され、アップサートを追加しても何も起こらないということです。

 Person.update({'items.id': 2}, {$set: {
    'items': { "item1",  "item2",  "item3",  "item4" } }, {upsert: 
true })
于 2020-02-26T17:36:28.760 に答える