我用它来向页面添加嵌入式文档
Page.findByIdAndUpdate(pageId, {
$addToSet: {
comments: {
$each: comments
}
}
}, (err, page) => {
// ...
});
当评论被添加到 Page
模型时,它们会自动获得一个 id
。
我想在给这些新插入的评论赋予一个 id 之后返回它们。
所以我想要类似的东西
Page.findByIdAndUpdate(pageId, {
$addToSet: {
comments: {
$each: comments
}
}
}, (err, page) => {
return page.newlyAddedComments();
});
我知道一种选择是在将 ID 插入数据库之前将其添加到数组 comments
中,但如果可能的话我想省略它。
最佳答案
正如@Shriram Manoharan 所说,不可能通过查找来剪切嵌入的文档。您可以使用聚合来做到这一点,但我认为它有点矫枉过正。
如果你想获取最后的文档:
在你的查找选项中使用新的(所以它返回页面变量中的更新数据)
{ new: true }
然后对返回的更新数据进行切片,只得到你需要的。 (新添加的数据将在数组的末尾)
Page.findByIdAndUpdate(pageId, {
$addToSet: {
comments: {
$each: comments
}
}
}, { new: true }, (err, page) => {
// Do not forget, what happend if _id is wrong?
// if (!page) return ...;
return page.comments.slice(page.comments.length - comments.length - 1);
});
PS:我看到你用的是es6语法。我建议您在代码中实现 Promises。我认为它提高了阅读能力并简化了函数链接。
Page.findByIdAndUpdate(pageId, {
$addToSet: {
comments: {
$each: comments
}
}
}, { new: true })
.then(page => page.comments.slice(page.comments.length - comments.length - 1))
.then(page => ...)
.catch(err => ...);
关于javascript - 使用 Mongoose 获取新嵌入的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39607755/