我有一个包含一组子文档的架构,我只需要更新其中一个。我findOne
使用子文档的 ID 执行操作,然后在返回的数组中的位置 0 处减少对该子文档的响应。
不管我做什么,我只能更新父文档中的第一个子文档,即使它应该是第二个、第三个等。无论如何,只有第一个被更新。据我所知,它应该可以工作,但我不是 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);