【问题标题】:Get newly embedded documents with mongoose使用 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。我只想返回新插入的评论
  • 据我所知,单独的嵌入文档不能在更新结果上分离。

标签: javascript arrays node.js mongodb mongoose


【解决方案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+
猜你喜欢
  • 1970-01-01
  • 2014-06-12
  • 2023-03-10
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 2012-06-23
相关资源
最近更新 更多