【问题标题】:Return only created subdocument mongoose仅返回创建的子文档 mongoose
【发布时间】:2018-10-01 10:59:18
【问题描述】:

我需要将一个新文档推入一个数组并使用他的_id。

现在我正在使用 findOneAndUpdate,我知道我可以使用 { new: true } 但我只需要创建的文档而不需要父文档。

这是我目前的代码

User.findOneAndUpdate(
    {
        'posts._id': req.params.id
    },
    {
        $push: {
            'posts.$.comments': {
                from: {
                    _id: req.user._id,
                    username: req.user.username,
                },
                body: req.body.commentBody
            }
        }
    },
    err => {
        if (err) console.log(err)
        // Do something with ObjectId
    }
);

提前致谢。

【问题讨论】:

  • 您需要重新表述您的问题。这里有什么问题? “我只需要创建的文档而不需要父文档”是什么意思? “使用他的_id”是什么意思?您是否只想在此文档中存储_id
  • 我有一个 cmets 数组,上面的代码创建了一个评论文档并将其插入到 cmets 数组中,现在我需要获取我刚刚创建的新评论文档的新 _id,我希望我解释得对
  • 我认为回调返回新文档。你只需要使用doc.comments[doc.comments.length]._id
  • ^ 但这仅适用于您具有嵌套模式并且不只是将子文档存储为 JSON 对象的情况。您应该将评论的模型放在帖子的架构中。
  • posts 也是一个数组,所以我们需要知道帖子的索引是什么,文档就像这个 doc.posts[postIndex].cmets[commentIndex] 这就是为什么我只想获取创建的文档而不是整个文档

标签: mongodb mongoose


【解决方案1】:

findOneAndUpdate 回调为您提供更新的文档。

你有帖子的_id。您可以使用它来查找要向其添加评论的帖子。当您推送评论时,它将是帖子数组中的最后一个元素。

var mypost = doc.posts.find(function(post){
    return post._id.toString()==req.params.id
});

console.log(mypost.comments[mypost.comments.length]._id)

【讨论】:

  • 回答您的问题,即如果两个 cmets 同时出现可能会出现问题 - 我不这么认为(尽管我不是 100% 确定)。即使它们同时来,mongo也会一个一个地更新文档,一个一个地返回。即使它没有按顺序执行(B 然后 A),您仍然会在各自的回调中获得带有 B 和 A 的文档。我认为它不会同时使用 B 和 A 更新文档并将该文档发送到两个回调
猜你喜欢
  • 2020-01-20
  • 2018-02-27
  • 2020-11-12
  • 1970-01-01
  • 2014-11-20
  • 2013-06-16
  • 2023-04-09
  • 2017-03-15
  • 2018-12-04
相关资源
最近更新 更多