Mongoosejs:findById 比 findOne 快吗?

Posted

技术标签:

【中文标题】Mongoosejs:findById 比 findOne 快吗?【英文标题】:Mongoosejs: Is findById faster than findOne? 【发布时间】:2018-05-03 16:22:11 【问题描述】:

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

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

    在包含所有帖子 ID 的用户模型中有一个帖子字段,然后在包含所有用户的所有帖子的帖子集合中通过 FindById 搜索每个字段

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

【问题讨论】:

【参考方案1】:

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

在您的用例上下文之外,如果提供 valid ObjectIds,findOne 的速度可能会微不足道,因为通过 .findOne( _id ) 传递无效 ID 并不能确保 _id 是一个有效的 ObjectId。

但是,如果 ID 格式不正确,.findById(_id) 将阻止查询 执行任何操作并实际抛出CastError,它 如果您不确定 ID 的来源,性能会更好, 例如用户输入,如果您想提供错误消息而不是空结果,还有额外的好处。

如前所述,这些细节似乎与您的用例无关,因为有问题的 ObjectId 已经存储在数据库中,更不用说这似乎是一个问题,即理论上什么查询会更快,而不是一个查询助手优于其他。

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

Posts.find( userId )

如果您还不知道用户的 ID,最好使用文档population 技术,因为这符合您的用例并且可能已针对此目的进行了优化。给定 PostUser 模型的一个(未经测试的)示例可能是:

User .findOne( foo: 'bar' ) .populate('posts') .select('-id posts')

这应该返回一个带有单个键 posts 的对象,其中包含一个帖子数组。

【讨论】:

以上是关于Mongoosejs:findById 比 findOne 快吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mongoosejs 中深度填充多个路径?

mongoosejs ??????

MongooseJS - ????????????

? MongooseJS ????????????

MongooseJS 无法禁用字段独有

无法使用 mongoosejs 填充