まず、この問題を部分的に解決するthis stack overflow entryを読みましたが、複数のエントリを動的に追加する必要があります。複数の値でネストされたオブジェクトを部分的に更新するExpress.js MongoDB
エクスプレスとmongodbドライバを使用して投票するウェブサイトがあり、投稿後に投票に追加オプションを追加できるようにします(追加アイテムの追加のみ可能、既存アイテムの編集はできません)。 )。
すべてのオプション(可能な回答)は、answer
の後に数字(最大5)と表示されます。
だから我々が持っているデータベースに:
{
"_id": {
"$oid": "58cdf0023cefa56136afb50f"
},
"question": "Who is the best Bob?",
"options": {
"answer1": {
"option": "Bob Dylan",
"votes": 2
},
"answer2": {
"option": "Bob Geldof",
"votes": 0
}
}
}
だから、このエントリでは、ユーザーは三つの追加解答オプションを追加することができます。
追加の回答名(このdbの例ではanswer3
など)をハードコードすると、入れ子になったoptions
プロパティを更新できます。
var toInsert = { options:
{ answer3: { option: 'Bob Saget', votes: 0 },
answer4: { option: 'Bob Marley', votes: 0 } } }
db.collection('questions')
.findOneAndUpdate({"_id": questionId}, {$set : {'options.answer3': [toInsert.answer3]}}, {upsert: true}, (err, result) => {
if (err) return res.send(err)
res.send("worked");
})
EDIT:適切な答えを私はちょうど彼もそれにバグがあり実現してきたので、私もハードコードすることはできません。しかし、ここではわかりやすくするためにこれを残しておきます。
しかし、入れ子になったoptions
オブジェクトを、ユーザーが望むものに応じて1-3の新しいオプションで動的に更新し、既存のデータだけをoptions
オブジェクトに残しておく必要があります。上の例のコードでは、answer3
とanswer4
の両方をtoInsert
から挿入したいと考えています。
私はノードとMongoDBをとても使い慣れていて、「ねえ、私はfor loop
に入れることができます」という私の考えは、それを働かせても悪い考えです。