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 )
Post
和 User
模型的一个(未经测试的)示例可能是:
User
.findOne( foo: 'bar' )
.populate('posts')
.select('-id posts')
这应该返回一个带有单个键 posts
的对象,其中包含一个帖子数组。
【讨论】:
以上是关于Mongoosejs:findById 比 findOne 快吗?的主要内容,如果未能解决你的问题,请参考以下文章