たとえば、mongooseを使って配列の2番目のアイテムを更新する方法はありますか?mongooseアイテムを位置/インデックス順に更新する
スキーマ:私の場合は
title: String,
answer: [{
content: String,
votes: Number
}]
Iは、第一または第二の答えを更新したいので、それはより多くの1票を持っています。
たとえば、mongooseを使って配列の2番目のアイテムを更新する方法はありますか?mongooseアイテムを位置/インデックス順に更新する
スキーマ:私の場合は
title: String,
answer: [{
content: String,
votes: Number
}]
Iは、第一または第二の答えを更新したいので、それはより多くの1票を持っています。
私はマングースの専門家ではありません。しかし、あなたが参照することができるanswerがあるようです。
短い答えは「はい」です。インデックスを指定して配列要素を更新できます。シェルでは、次のようになります。0
は更新したい要素のインデックスである
db.collection.update({...}, {$inc: {"answer.0.votes": 1}})
。私はあなたが文法をどのようにマングースで書くのかを見つけることができると確信しています。
私の意見では、インデックスで配列を更新するのは良い考えではありません。要素が削除/挿入された場合はどうなりますか?あなたの埋め込み配列要素は、RDBMS
の1対多の関係に似ています。彼らはより簡単に見つけるためにObjectId
のようなユニークな識別子を持つべきです。あなたがアップに投票され、正確な答えを見つけるためにid
によって
{
title: "This is a question",
answer: [{
id: ObjectId("584e6c496c9b4252733ea6fb"),
content: "Answer",
votes: 0
}]
}
とクエリ:データ構造を推奨
$
は、配列の一致した要素を意味する
db.collection.update({"answer": {$elemMatch: {id: ObjectId("584e6c496c9b4252733ea6fb")}}}, {$inc: {"answer.$.votes": 1}});
。
これを試してみてください:
Model.findOne({ title: 'your-title' }, function (err, doc){
doc.answer.0.votes.$inc(); // increases votes on first answer by 1
doc.save();
});
'0'をパラメータとして渡すことはできますか? doc.answer.myIndex.votes。$ inc() –
はい、それを試すことができます。 –
あなたの答えを少し編集しましたので、変数を渡すことができます: var incObject = {}; incObject ['オプション。' + myIndex + '。votes'] = 1; db.collection.update({...}、{$ inc:incObject}) –