私はこのようなオブジェクトを持っています。Node.js - Mongoose - req.bodyのすべての値を含むネストされた配列を更新します。
{
_id: '577fe7a842c9b447',
name: 'Jacob\'s Bronze Badges',
competitors: [
{
_id: '577fe7a842c9bd6d',
name: 'Peter\'s Silver Badges',
sites: [
{
_id: '577fe7a842c9bd6d',
name: 'Facebook',
url: 'fb.com/peter'
},
{
_id: '577fe7a842c9bd6d'
name: 'Google',
url: 'google.com/peter'
}
]
},
{
_id: '599fe7a842c9bd6d',
name: 'Paul\'s Gold Badges',
sites: [
{
'_id': '577fe7a842c9bd6d',
name: 'Facebook',
url: 'fb.com/paul'
},
{
_id: '577fe7a842c9bd6d',
name: 'Google',
url: 'google.com/paul'
}
]
}
]
}
私の目標は、req.body
からすべての値を持つ内部でcompetitors
アレイとアップデートの項目を参照することです。私はこのコードをthisの回答に基づいて、またthis other oneに基づいています。
Location.update(
{ 'competitors._id': req.params.competitorId, },
{ $set: { 'competitors.$': req.body, }, },
(err, result) => {
if (err) {
res.status(500)
.json({ error: 'Unable to update competitor.', });
} else {
res.status(200)
.json(result);
}
}
);
私はピーターのシルバーバッジを更新するためにlocalhost:3000/competitors/577fe7a842c9bd6d
に私のHTTP PUT
を送ります。リクエストボディは、次のとおりです。
{
"name": "McDonald's"
}
問題は、私は_id: req.params.competitorId
でライバルを設定するために$set
を使用する場合、私はreq.body
にあるかわからないということです。私は、配列内のオブジェクトを更新するために全体req.body
を使用したいが、私が行うとき、そのオブジェクトが上書きされ、その代わりに新しい名前を得るための、ピーターのシルバーバッジは次のようになります。
{
name: 'McDonald\'s',
sites: []
}
どのように更新することができます配列内のオブジェクトは、オブジェクトの_id
がすべてのフィールドがreq.body
で、保持したいフィールドを削除せずに知っていますか?
オブジェクトが再初期化されたため、sites
配列が空であると思います。私のスキーマでは、それを初期化するためにsites: [sitesSchema]
があります。だから私は、competitors[_id]
オブジェクト全体が新しい名前で上書きされていると仮定していて、次にmyschemaからsites: [sitesSchema]
を取得すると仮定しています。