サブドキュメントの配列を持つスキーマを持っています。そのうちの 1 つだけを更新する必要があります。サブドキュメントの ID を使用しfindOne
て、返された配列の位置 0 にあるそのサブドキュメントへの応答を切り詰めます。
私が何をしても、親ドキュメントの最初のサブドキュメントしか更新できません。それが 2 番目、3 番目などであっても、最初のサブドキュメントだけが更新されます。私が知る限り、動作するはずですが、私は MongoDB や Mongoose の専門家ではないため、明らかにどこかが間違っています。
var template = req.params.template;
var page = req.params.page;
console.log('Template ID: ' + template);
db.Template.findOne({'pages._id': page}, {'pages.$': 1}, function (err, tmpl) {
console.log('Matched Template ID: ' + tmpl._id);
var pagePath = tmpl.pages[0].body;
if(req.body.file) {
tmpl.pages[0].background = req.body.filename;
tmpl.save(function (err, updTmpl) {
console.log(updTmpl);
if (err) console.log(err);
});
// db.Template.findOne(tmpl._id, function (err, tpl) {
// console.log('Additional Matched ID: ' + tmpl._id);
// console.log(tpl);
// tpl.pages[tmpl.pages[0].number].background = req.body.filename;
// tpl.save(function (err, updTmpl){
// if (err) console.log(err);
// });
// });
}
コンソールでは、すべての ID が適切に一致し、updTmpl を返しても、実際には最初のサブドキュメントが更新され、それが持っていると言っているサブドキュメントではなく、適切なレコードが更新されたと言っています。
念のためのスキーマ:
var envelopeSchema = new Schema({
background: String,
body: String
});
var pageSchema = new Schema({
background: String,
number: Number,
body: String
});
var templateSchema = new Schema({
name: { type: String, required: true, unique: true },
envelope: [envelopeSchema],
pagecount: Number,
pages: [pageSchema]
});
templateSchema.plugin(timestamps);
module.exports = mongoose.model("Template", templateSchema);