使用mongoose更新嵌套数组中的字段

时间:2018-04-03 20:34:39

标签: node.js express mongoose

我正在尝试更新数组中的子文档但没有成功。新数据无法保存。

快递:

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
      }
    }
  ]
});

我的目的只是更新子文档,而不是同时更新父文档和子文档。

1 个答案:

答案 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()改变了。