如何在猫鼬中向嵌套数组添加对象?

时间:2018-09-26 13:49:58

标签: node.js mongodb express mongoose

从本质上讲,我试图做的是类似FindByIdAndCreate的事情,这种方法在猫鼬中是不存在的。

我有一个架构:

const WordSchema = new Schema ({
    TargetWord: String,
    Translation: String, 
    ExampleSentences: [{            
        Number: Number, //increment somehow each time 
        Sentence: String, 
    }],
});

我有一个表单,用户可以在其中添加此目标词的例句,其路由如下所示:

router.put("/word/:id/add", async(req, res) => {
    //get the new sentence from the field 
        var NewSentence = req.body.Sentence;

现在,一旦将新句子保存到变量NewSentence中,我想在WordSchema.ExampleSentences数组中创建一个新对象,该数组包含新句子本身以及应该自动递增的数字。

我摆弄FindByIdAndUpdate无济于事,此语法不起作用,因为在使用.时会抛出错误。

WordSchema.findByIdAndUpdate(req.params.id, {ExampleSentences.Sentence: NewSentence}, ...

1 个答案:

答案 0 :(得分:1)

增加计数器的唯一解决方案是使用良好的旧“查找”来检索每个文档并相应地创建新条目,因为在此过程中“更新”无法自引用文档。

router.put("/word/:id/add", async(req, res) => {
    WordSchema.find({_id: req.body.id}, function(results) {
        if (results.length === 0) return res.json();

        const word = result[0];

        const NewExampleSentence = {
            Number: word.ExampleSentences.length, // if your counter start from 1, then add 1 
            Sentence: req.body.Sentence
        };

        word.ExampleSentences.push(NewExampleSentence);
        word.save(function(err) {
            if (err) {
                // handle error
            }
            return res.json();
        })
    }
})