我想更新具有列表名称的数组中的数组中的note
。
我有用户的_id
,列表的name: 'Test'
,书的_id
和要更新到的note
。
我的模型如下:
const userSchema = new Schema({
_id,
...,
lists: [
{
name: String,
books: [
{
_id: { type: Schema.Types.ObjectId, ref: 'Books' },
note: { type : Number, default: null }
}
]
}
]
})
我尝试使用$set
和$push
,但得到了另一个名为“ Test”的列表。我也尝试过搜索用户_id并使用.filter()在javascript中手动查找来查找我的书,但是Mongoose似乎有解决方案。
试图执行以下查询,但没有成功
({_id: req.myUser._id, 'lists': { $elemMatch: { 'name' : 'General' }}})
例如,我想将qozirjqzàçorizq
更新为15:
{
_id: qoizrhqzoi, <--------------- I know this
lists: [
{
name:'General', <--------------- I know this
books: [
{
_id: qozirjqzàçorizq, <---------- I know this
note: 12 <-------------- Want to change that
}
]
},
{
name: 'Perso1'
books: [
{
_id: 8qzrq654rz,
note: 1
}
]
}
]
}
我的json采用以下格式,但可以更改为仅包含_id,名称,_id和注释4个字段。
{
_id: qozirjqzàçorizq,
note: 15
}
如何在两个嵌套数组中更新此特定字段(注释)?
编辑:我已经设法更新了该书,但它并不更新,它总是替换当前的书,它不作为数组
User.findOneAndUpdate(
{ _id: req.myUser._id,
"lists" : { $elemMatch :
{ name: req.params.listName }
}
},
{
$set: { 'lists.$.books': req.body}
},
{
new: true,
upsert: true
})
.exec()
.then(res => {
console.log(res)
})
.catch( err => {
console.error(err)
}
答案 0 :(得分:0)
我更新如下
User.findById(id)
.exec((err, user) => {
if(user) {
let added = user.lists.id(req.params.listId).books.addToSet(req.body)
if(added.length <= 1) {
let book = user.lists.id(req.params.listId).books.id(req.params.artworkId)
book.note = req.body.note
book.lastModified = Date.now()
}
user.save()
res.status(200).json({
message : "Success"
})
}
})