mongoose Model.find和Query.prototype.find()的区别

cx6n0qe3  于 2023-05-18  发布在  Go
关注(0)|答案(1)|浏览(288)

Mongoose中Model.find()和Query.prototype.find()有什么区别?它们似乎都在做同样的事情,返回一个Query示例。它们之间有什么区别吗?我应该使用一个vs另一个吗?如果问题看起来太简单,我很抱歉。我不是编程新手,但我是JavaScript新手。

v64noz0r

v64noz0r1#

queries文档中,我们知道:
Mongoose模型为CRUD操作提供了几个静态帮助函数。每个函数返回一个mongoose Query对象。
Model.find()方法只是Query.prototype.find()方法的 Package 器。Model上常用的Model.deleteOne()Model.find()等方法封装了查询对象上的多个方法调用,使用起来更加方便
Model.find()源代码,参见7.1.1/lib/model.js#L2045

Model.find = function find(conditions, projection, options) {
  _checkContext(this, 'find');
  if (typeof arguments[0] === 'function' || typeof arguments[1] === 'function' || typeof arguments[2] === 'function' || typeof arguments[3] === 'function') {
    throw new MongooseError('Model.find() no longer accepts a callback');
  }

  const mq = new this.Query({}, {}, this, this.$__collection);
  mq.select(projection);
  mq.setOptions(options);

  return mq.find(conditions);
};

this.QueryQuery类的子类,请参见7.1.1/lib/model.js#L4620

const Query = require('./query');
// ...

model.Query = function() {
  Query.apply(this, arguments);
};
Object.setPrototypeOf(model.Query.prototype, Query.prototype);

继承是如何工作的?请参见使用Object.setPrototypeOf()的伪经典继承
它创建一个查询示例,并调用Query.prototype.select()和Query.prototype.setOptions()来设置查询的projectionoptions。最后,调用Query.prototype.find()方法。

相关问题