Mongoose中Model.findOne()和Model.findById()有什么区别?

40
考虑我们基于_id值从MongoDB中搜索文档。以下哪种代码更有效?
  1. ModelObj.findById(IdValue).exec(callback);

  2. ModelObj.findOne({ '_id': IdValue}).exec(callback);

我认为ModelObj.findById()更有效,但是支持这个观点的原因是什么?
4个回答

59

findById只是一个方便的函数,其执行与你展示的findOne调用完全相同。

这里是源代码

Model.findById = function findById (id, fields, options, callback) {
  return this.findOne({ _id: id }, fields, options, callback);
};

我本来以为/希望它会消耗更少的计算能力,因为它是通过ID查找的。但是没有 :) - undefined

29

findById(id) 几乎等同于 findOne({ _id: id })
如果您想按文档的 `_id` 查询,请使用 findById() 而不是 findOne()

这两个函数都会触发 findOne(),唯一的区别在于它们如何处理 undefined
如果您使用 findOne(),您会发现 findOne(undefined)findOne({ _id: undefined }) 等同于 findOne({}) 并返回任意文档。
然而,mongoose 将 findById(undefined) 转换为 findOne({ _id: null })

请参见https://mongoosejs.com/docs/api.html#model_Model.findById

这里是源代码

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);
};

1

findById(id)只是find({_id : id})或findOne({_id: id})的语法糖。


-3

使用.findOne让数据库查找其记录,检查每个bson文档以找到相关变量,然后检查值。如果Mongo知道它正在寻找内部索引的_id字段,则不必查看每个文档。


1
正如JohnnyHK所指出的那样,在幕后它执行完全相同的操作。 - Adriano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接