我正在尝试更新数组中的子文档但没有成功。新数据无法保存。
快递:
router.put('/:id/:bookid', (req, res) => {
library.findOneAndUpdate(
{ "_id": req.params.id, "books._id": req.params.bookid},
{
"$set": {
"title.$": 'new title'
}
}
});
LibraryScema:
const LibarySchema = new Library({
Name: {
type: String,
required: false
},
books: [BookSchema]
});
bookScema:
const BookSchema = new Schema({
title: {
type: String,
required: false
},
Chapters: [
{
chapterTitle: {
type: String,
required: false
}
}
]
});
我的目的只是更新子文档,而不是同时更新父文档和子文档。
答案 0 :(得分:1)
我有类似的问题。我相信$set
在嵌套数组方面有问题(GitHub上有一个完整的问题线程)。这就是我解决问题的方法。
var p = req.params;
var b = req.body;
Account.findById(req.user._id, function (err, acc) {
if (err) {
console.log(err);
} else {
acc.websites.set(req.params._id, req.body.url); //This solved it for me
acc.save((err, webs) => {
if (err) {
console.log(err);
} else {
console.log('all good');
res.redirect('/websites');
}
});
}
});
我有一个嵌套数组的用户。
试试此代码
router.put('/:id/:bookid', (req, res) => {
library.findById(
req.params.id, (err, obj) => {
if (err) console.log(err); // Debugging
obj.books.set(req.params.bookid, {
"title": 'new title',
'Chapters': 'your chapters array'
});
obj.save((err,obj)=>{
if(err) console.log(err); // Debugging
else {
console.log(obj); // See if the saved object is what expected;
res.redirect('...') // Do smth here
}
})
})
});
让我知道它是否有效,我将添加解释。
说明:首先找到正确的对象(在本例中为library
),然后在数组中找到名为books
的正确对象。
使用.set
将整个对象设置为新状态。您需要从之前的库对象实例中获取未更改的数据。
我相信这种方式会覆盖并 删除 任何未传递到.set()
方法的数据。然后你save()
改变了。