如何在数组内部的数组内部更新对象字段

时间:2019-08-05 19:58:41

标签: mongoose

我想更新具有列表名称的数组中的数组中的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)
    }

1 个答案:

答案 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"
                })
            }
        })