Mongoosejs:findById比findOne更快吗?

时间:2017-11-20 12:35:37

标签: database mongodb mongoose mongodb-query

我正在开发一个用户可以拥有多个帖子的项目。

所以我想知道哪种方法更适合查询他的所有帖子

  1. 在用户模型中有一个包含所有帖子ID的帖子字段,然后在帖子集合中搜索每个FindById,其中包含来自所有用户的所有帖子

  2. 一次查询所有帖子集合并查找给定用户的所有帖子

1 个答案:

答案 0 :(得分:0)

我会尝试回答标题中的问题以及具体的用例,从标题开始。

  • 在您的用例的上下文之外,当提供有效 ObjectIds时,findOne的速度可能会非常快,因为通过.findOne({ _id })传递无效ID将无法确保{{ 1}}是一个有效的ObjectId。

  • 但是,如果ID格式错误,_id会阻止查询 从执行任何实际抛出.findById(_id),其中 如果你不确定ID的来源,会更有效率, 例如用户输入,如果您想提供错误消息而不是空结果,则可以获得额外的好处。

如前所述,这些细节似乎与您的用例无关,因为所讨论的ObjectId已存储在数据库中,更不用说这似乎是一个问题,理论上的查询顺序是什么更快,而不是一个查询帮助器。

  • 如果您已经有相关用户的ObjectId,则无需通过直接查询Posts表来完全查询User集合,从而节省时间。 这是假设您在包含用户ID的字段上有index。如你所知:

CastError

  • 如果您还不知道用户的ID,则会热衷于使用文档population技术,因为这符合您的使用案例,并且可能已针对此目的进行了优化。给定Posts.find({ userId })Post模型的一个(未经测试的)示例可以是:

User

这应该返回一个对象,其中包含一个包含帖子数组的单个键User .findOne({ foo: 'bar' }) .populate('posts') .select('-id posts')