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() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 选择子文档字段

无法访问从猫鼬fineOne()返回的json中的键[重复]

如何使用 Mongoose 查询过滤到数组类型字段中具有指定值的文档?

用于查找唯一文档的猫鼬查询

在使用急切加载的 findOne Sequelize 方法期间,Nodejs 堆内存不足

从另一个 mongoose.Schema 调用 mongoose.Schema 中的静态