使用 mongoose 获取新嵌入的文档
Posted
技术标签:
【中文标题】使用 mongoose 获取新嵌入的文档【英文标题】:Get newly embedded documents with mongoose 【发布时间】:2017-01-29 04:25:58 【问题描述】:我用它来将嵌入的文档添加到页面中
Page.findByIdAndUpdate(pageId,
$addToSet:
comments:
$each: comments
, (err, page) =>
// ...
);
当 cmets 添加到 Page
模型时,它们会自动获得一个 id
。
我想在这些新插入的 cmets 被赋予 id 后返回它们。
所以我想要类似的东西
Page.findByIdAndUpdate(pageId,
$addToSet:
comments:
$each: comments
, (err, page) =>
return page.newlyAddedComments();
);
我知道一种选择可能是将 ID 添加到数组 comments
中,然后再将它们插入数据库,但如果可能的话,我想省略它。
【问题讨论】:
您是否尝试过选项中的“新”? 我已经阅读了new
选项。如果我使用 new: true
选项并返回page.comments
,它会起作用,但我不想返回所有的cmets。我只想返回新插入的评论
据我所知,单独的嵌入文档不能在更新结果上分离。
【参考方案1】:
就像@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 => ...);
【讨论】:
谢谢!第二个.then()
是干什么用的?你添加它只是为了告诉我我可以链接多个then()
吗?但是什么时候重复 then()
块有用呢?
获取所有的 cmets,计数,然后切掉一个元素不是很慢吗?
是的,第二个then
是您可以做其他事情的地方。如果它很长(文档中有很多数据),请进行聚合。但在 99% 的情况下,您不会在文档的嵌套数组中存储大量数据。
Ps:很多意味着10000+以上是关于使用 mongoose 获取新嵌入的文档的主要内容,如果未能解决你的问题,请参考以下文章