考虑我们正在根据 _id 值从 MongoDB 中搜索文档。以下哪一个代码是有效的?
ModelObj.findById(IdValue).exec(callback);
ModelObj.findOne({ '_id': IdValue}).exec(callback);
我觉得 ModelObj.findById() 是高效的,但是支持的原因是什么或者它的效率如何?
findById
findOne
只是一个便利功能,与您显示的调用完全相同。
这是来源:
Model.findById = function findById (id, fields, options, callback) {
return this.findOne({ _id: id }, fields, options, callback);
};
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
这是来源:
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);
};
findById(id) 只是 find({_id : id}) 或 findOne({_id: id}) 的语法糖
使用 .findOne 使数据库查看其记录,检查每个 bson 文档以查找相关变量,然后检查值,如果 mongo 知道它正在查找内部索引的 _id 字段,则不必查看每个文档