使用 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 获取新嵌入的文档的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose FindOneAndUpdate 嵌入对象并返回父对象

Mongoose/Mongo:更新不保存

使用 Mongoose 查询嵌套的嵌入文档

Mongo - 如果子文档数组中的对象具有值,则添加字段

Mongoose 单个嵌入子文档默认

通过 express、mongoose 和 angular 删除 mongo 文档时出现 404