Mongoose 中的 Model.findOne() 和 Model.findById() 有啥区别?
Posted
技术标签:
【中文标题】Mongoose 中的 Model.findOne() 和 Model.findById() 有啥区别?【英文标题】:What is the difference between Model.findOne() & Model.findById() in Mongoose?Mongoose 中的 Model.findOne() 和 Model.findById() 有什么区别? 【发布时间】:2012-12-24 16:53:03 【问题描述】:假设我们正在根据 _id 值从 MongoDB 中搜索文档。下面哪一个代码是高效的?
ModelObj.findById(IdValue).exec(callback);
ModelObj.findOne( '_id': IdValue).exec(callback);
我觉得 ModelObj.findById() 是高效的,但是支持的原因是什么或者它的效率如何?
【问题讨论】:
【参考方案1】:findById
只是一个便利函数,它与您显示的 findOne
调用完全相同。
这里是the source:
Model.findById = function findById (id, fields, options, callback)
return this.findOne( _id: id , fields, options, callback);
;
【讨论】:
【参考方案2】:findById(id)
几乎等同于findOne( _id: id )
。
如果要通过文档的_id查询,请使用findById()
而不是findOne()
。
两个函数都触发findOne()
,唯一的区别是它们如何对待undefined
。
如果你使用findOne()
,你会看到findOne(undefined)
和findOne( _id: undefined )
等价于findOne()
并返回任意文档。
然而,猫鼬将findById(undefined)
翻译成findOne( _id: null )
。
见https://mongoosejs.com/docs/api.html#model_Model.findById
这是source:
Model.findById = function findById(id, projection, options, callback)
if (typeof id === 'undefined')
id = null;
if (callback)
callback = this.$wrapCallback(callback);
return this.findOne(_id: id, projection, options, callback);
;
【讨论】:
【参考方案3】:findById(id) 只是 find(_id : id) 或 findOne(_id: id) 的语法糖
【讨论】:
【参考方案4】:使用 .findOne 使数据库查看其记录,检查每个 bson 文档以查找相关变量,然后检查值,如果 mongo 知道它正在查找内部索引的 _id 字段,则不必查看每个文档
【讨论】:
正如 JohnnyHK 所指出的,它在引擎盖下做了完全相同的事情以上是关于Mongoose 中的 Model.findOne() 和 Model.findById() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
无法访问从猫鼬fineOne()返回的json中的键[重复]
如何使用 Mongoose 查询过滤到数组类型字段中具有指定值的文档?