从本质上讲,我试图做的是类似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}, ...
答案 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();
})
}
})