查询
Query()
Query.prototype.$where()
Query.prototype.all()
Query.prototype.allowDiskUse()
Query.prototype.and()
Query.prototype.batchSize()
Query.prototype.box()
Query.prototype.cast()
Query.prototype.catch()
Query.prototype.center()
Query.prototype.centerSphere()
Query.prototype.circle()
Query.prototype.clone()
Query.prototype.collation()
Query.prototype.comment()
Query.prototype.countDocuments()
Query.prototype.cursor()
Query.prototype.deleteMany()
Query.prototype.deleteOne()
Query.prototype.distinct()
Query.prototype.elemMatch()
Query.prototype.equals()
Query.prototype.error()
Query.prototype.estimatedDocumentCount()
Query.prototype.exec()
Query.prototype.exists()
Query.prototype.explain()
Query.prototype.finally()
Query.prototype.find()
Query.prototype.findOne()
Query.prototype.findOneAndDelete()
Query.prototype.findOneAndReplace()
Query.prototype.findOneAndUpdate()
Query.prototype.geometry()
Query.prototype.get()
Query.prototype.getFilter()
Query.prototype.getOptions()
Query.prototype.getPopulatedPaths()
Query.prototype.getQuery()
Query.prototype.getUpdate()
Query.prototype.gt()
Query.prototype.gte()
Query.prototype.hint()
Query.prototype.in()
Query.prototype.intersects()
Query.prototype.isPathSelectedInclusive()
Query.prototype.j()
Query.prototype.lean()
Query.prototype.limit()
Query.prototype.lt()
Query.prototype.lte()
Query.prototype.maxDistance()
Query.prototype.maxTimeMS()
Query.prototype.merge()
Query.prototype.mod()
Query.prototype.model
Query.prototype.mongooseOptions()
Query.prototype.ne()
Query.prototype.near()
Query.prototype.nearSphere()
Query.prototype.nin()
Query.prototype.nor()
Query.prototype.or()
Query.prototype.orFail()
Query.prototype.polygon()
Query.prototype.populate()
Query.prototype.post()
Query.prototype.pre()
Query.prototype.projection()
Query.prototype.read()
Query.prototype.readConcern()
Query.prototype.regex()
Query.prototype.replaceOne()
Query.prototype.sanitizeProjection()
Query.prototype.select()
Query.prototype.selected()
Query.prototype.selectedExclusively()
Query.prototype.selectedInclusively()
Query.prototype.session()
Query.prototype.set()
Query.prototype.setOptions()
Query.prototype.setQuery()
Query.prototype.setUpdate()
Query.prototype.size()
Query.prototype.skip()
Query.prototype.slice()
Query.prototype.sort()
Query.prototype.tailable()
Query.prototype.then()
Query.prototype.toConstructor()
Query.prototype.transform()
Query.prototype.updateMany()
Query.prototype.updateOne()
Query.prototype.w()
Query.prototype.where()
Query.prototype.within()
Query.prototype.writeConcern()
Query.prototype.wtimeout()
Query.prototype[Symbol.asyncIterator]()
Query.prototype[Symbol.toStringTag]()
Query.use$geoWithin
Query()
参数
[options]
«Object»[model]
«Object»[conditions]
«Object»[collection]
«Object» Mongoose 集合
用于构建查询的查询构造函数。 您无需直接实例化 Query
。 相反,请使用模型函数,例如 Model.find()
.
示例
const query = MyModel.find(); // `query` is an instance of `Query`
query.setOptions({ lean : true });
query.collection(MyModel.collection);
query.where('age').gte(21).exec(callback);
// You can instantiate a query directly. There is no need to do
// this unless you're an advanced user with a very good reason to.
const query = new mongoose.Query();
Query.prototype.$where()
参数
js
«String|Function» javascript 字符串或函数
返回值
- «Query» this
参见
指定要传递给 MongoDB 查询系统的 javascript 函数或表达式。
示例
query.$where('this.comments.length === 10 || this.name.length === 5')
// or
query.$where(function () {
return this.comments.length === 10 || this.name.length === 5;
})
注意
仅当您无法使用其他 MongoDB 运算符(例如 $lt
)满足条件时,才使用 $where
。 在使用之前,请务必阅读有关 其所有注意事项。
Query.prototype.all()
参数
[path]
«String»val
«Array»
参见
指定 $all
查询条件。
当使用一个参数调用时,将使用传递给 where()
的最新路径。
示例
MyModel.find().where('pets').all(['dog', 'cat', 'ferret']);
// Equivalent:
MyModel.find().all('pets', ['dog', 'cat', 'ferret']);
Query.prototype.allowDiskUse()
参数
[v]
«Boolean» 启用/禁用allowDiskUse
。 如果不带任何参数调用,则设置为allowDiskUse: true
返回值
- «Query» this
设置 allowDiskUse
选项,该选项允许 MongoDB 服务器为该查询的 sort()
使用超过 100 MB 的内存。 此选项可以帮助您解决来自 MongoDB 服务器的 QueryExceededMemoryLimitNoDiskUseAllowed
错误。
请注意,此选项需要 MongoDB 服务器 >= 4.4。 对于 MongoDB 4.2 及更早版本,设置此选项是无操作。
调用 query.allowDiskUse(v)
等效于 query.setOptions({ allowDiskUse: v })
示例
await query.find().sort({ name: 1 }).allowDiskUse(true);
// Equivalent:
await query.find().sort({ name: 1 }).allowDiskUse();
Query.prototype.and()
参数
array
«Array» 条件数组
返回值
- «Query» this
参见
Query.prototype.batchSize()
参数
val
«Number»
参见
Query.prototype.box()
参数
val1
«Object|Array<Number>» 左下角坐标或左下角 (ll) 和右上角 (ur) 坐标的 object[val2]
«Array<Number>» 右上角坐标
返回值
- «Query» this
参见
指定 $box
条件
示例
const lowerLeft = [40.73083, -73.99756]
const upperRight= [40.741404, -73.988135]
query.where('loc').within().box(lowerLeft, upperRight)
query.box({ ll : lowerLeft, ur : upperRight })
Query.prototype.cast()
参数
[model]
«Model» 要转换为的模型。 如果未设置,则默认为this.model
[obj]
«Object»
返回值
- «Object»
Query.prototype.catch()
参数
[reject]
«Function»
返回值
- «Promise»
执行查询,返回一个 Promise
,该 Promise
将使用文档 (s) 解决或使用错误拒绝。 与 .then()
相似,但只接受拒绝处理程序。
有关 JavaScript 中的 Promise catch()
的更多信息。
Query.prototype.center()
~已弃用~Query.prototype.centerSphere()
~已弃用~参数
[path]
«String»val
«Object»
返回值
- «Query» this
参见
已弃用 指定 $centerSphere
条件
已弃用。 请改用 circle。
示例
const area = { center: [50, 50], radius: 10 };
query.where('loc').within().centerSphere(area);
Query.prototype.circle()
参数
[path]
«String»area
«Object»
返回值
- «Query» this
参见
指定 $center
或 $centerSphere
条件。
示例
const area = { center: [50, 50], radius: 10, unique: true }
query.where('loc').within().circle(area)
// alternatively
query.circle('loc', area);
// spherical calculations
const area = { center: [50, 50], radius: 10, unique: true, spherical: true }
query.where('loc').within().circle(area)
// alternatively
query.circle('loc', area);
Query.prototype.clone()
返回值
- «Query» copy
复制此查询,以便您可以重新执行它。
示例
const q = Book.findOne({ title: 'Casino Royale' });
await q.exec();
await q.exec(); // Throws an error because you can't execute a query twice
await q.clone().exec(); // Works
Query.prototype.collation()
参数
value
«Object»
返回值
- «Query» this
参见
为此操作添加排序规则(MongoDB 3.4 及更高版本)
Query.prototype.comment()
参数
val
«String»
参见
Query.prototype.countDocuments()
参数
[filter]
«Object» mongodb 选择器[options]
«Object»
返回值
- «Query» this
参见
将此查询指定为 countDocuments()
查询。 行为类似于 count()
,不同之处在于,它始终在传递空过滤器 {}
时执行完整的集合扫描。
在处理 $where
和一些地理空间运算符 方面,countDocuments()
也存在细微差异。 与 count()
相比。
此函数触发以下中间件。
countDocuments()
示例
const countQuery = model.where({ 'color': 'black' }).countDocuments();
query.countDocuments({ color: 'black' }).count().exec();
await query.countDocuments({ color: 'black' });
query.where('color', 'black').countDocuments().exec();
countDocuments()
函数类似于 count()
,但有一些 countDocuments()
不支持的运算符。 以下是 count()
支持但 countDocuments()
不支持的运算符,以及建议的替代方案
$where
:$expr
$near
: 使用$geoWithin
和$center
$nearSphere
: 使用$geoWithin
和$centerSphere
Query.prototype.cursor()
参数
[options]
«Object»
返回值
- «QueryCursor»
参见
返回 mongodb 驱动程序游标 的包装器。 QueryCursor 公开了 Streams3 接口以及 .next()
函数。
.cursor()
函数会触发预查找挂钩,但不会触发后查找挂钩。
示例
// There are 2 ways to use a cursor. First, as a stream:
Thing.
find({ name: /^hello/ }).
cursor().
on('data', function(doc) { console.log(doc); }).
on('end', function() { console.log('Done!'); });
// Or you can use `.next()` to manually get the next doc in the stream.
// `.next()` returns a promise, so you can use promises or callbacks.
const cursor = Thing.find({ name: /^hello/ }).cursor();
cursor.next(function(error, doc) {
console.log(doc);
});
// Because `.next()` returns a promise, you can use co
// to easily iterate through all documents without loading them
// all into memory.
const cursor = Thing.find({ name: /^hello/ }).cursor();
for (let doc = await cursor.next(); doc != null; doc = await cursor.next()) {
console.log(doc);
}
有效选项
transform
: 可选函数,接受 mongoose 文档。 函数的返回值将在data
上发出,并由.next()
返回。
Query.prototype.deleteMany()
参数
[filter]
«Object|Query» mongodb 选择器[options]
«Object» 可选,请参阅Query.prototype.setOptions()
返回值
- «Query» this
参见
声明和/或执行此查询作为 deleteMany()
操作。 工作原理类似于 remove,不同之处在于它删除集合中与 filter
匹配的所有文档,而不管 single
的值如何。
此函数触发 deleteMany
中间件。
示例
await Character.deleteMany({ name: /Stark/, age: { $gte: 18 } });
此函数调用 MongoDB 驱动程序的 Collection#deleteMany()
函数。 返回的 promise 解析为一个包含 3 个属性的 object
ok
: 如果没有错误发生,则为1
deletedCount
: 删除的文档数量n
: 删除的文档数量。 等于deletedCount
。
示例
const res = await Character.deleteMany({ name: /Stark/, age: { $gte: 18 } });
// `0` if no docs matched the filter, number of docs deleted otherwise
res.deletedCount;
Query.prototype.deleteOne()
参数
[filter]
«Object|Query» mongodb 选择器[options]
«Object» 可选,请参阅Query.prototype.setOptions()
返回值
- «Query» this
参见
声明和/或执行此查询作为 deleteOne()
操作。 工作原理类似于 remove,不同之处在于它最多删除一个文档,而不管 single
选项如何。
此函数触发 deleteOne
中间件。
示例
await Character.deleteOne({ name: 'Eddard Stark' });
此函数调用 MongoDB 驱动程序的 Collection#deleteOne()
函数。 返回的 promise 解析为一个包含 3 个属性的 object
ok
: 如果没有错误发生,则为1
deletedCount
: 删除的文档数量n
: 删除的文档数量。 等于deletedCount
。
示例
const res = await Character.deleteOne({ name: 'Eddard Stark' });
// `1` if MongoDB deleted a doc, `0` if no docs matched the filter `{ name: ... }`
res.deletedCount;
Query.prototype.distinct()
参数
[field]
«String»[filter]
«Object|Query»[options]
«Object»
返回值
- «Query» this
参见
声明或执行 distinct() 操作。
此函数不触发任何中间件。
示例
distinct(field, conditions, options)
distinct(field, conditions)
distinct(field)
distinct()
Query.prototype.elemMatch()
参数
path
«String|Object|Function»filter
«Object|Function»
返回值
- «Query» this
参见
指定 $elemMatch
条件
示例
query.elemMatch('comment', { author: 'autobot', votes: {$gte: 5}})
query.where('comment').elemMatch({ author: 'autobot', votes: {$gte: 5}})
query.elemMatch('comment', function (elem) {
elem.where('author').equals('autobot');
elem.where('votes').gte(5);
})
query.where('comment').elemMatch(function (elem) {
elem.where({ author: 'autobot' });
elem.where('votes').gte(5);
})
Query.prototype.equals()
参数
val
«Object»
返回值
- «Query» this
Query.prototype.error()
参数
err
«Error|null» 如果设置,exec()
将在将查询发送到 MongoDB 之前快速失败
返回值
- «Query» this
获取/设置此查询的错误标志。 如果此标志不是 null 或 undefined,则 exec()
promise 将在不执行的情况下拒绝。
示例
Query().error(); // Get current error value
Query().error(null); // Unset the current error
Query().error(new Error('test')); // `exec()` will resolve with test
Schema.pre('find', function() {
if (!this.getQuery().userId) {
this.error(new Error('Not allowed to query without setting userId'));
}
});
请注意,查询转换在挂钩之后运行,因此转换错误将覆盖自定义错误。
示例
const TestSchema = new Schema({ num: Number });
const TestModel = db.model('Test', TestSchema);
TestModel.find({ num: 'not a number' }).error(new Error('woops')).exec(function(error) {
// `error` will be a cast error because `num` failed to cast
});
Query.prototype.estimatedDocumentCount()
参数
[options]
«Object» 透明地传递给 MongoDB 驱动程序
返回值
- «Query» this
参见
将此查询指定为 estimatedDocumentCount()
查询。对于大型集合,它比使用 countDocuments()
更快,因为 estimatedDocumentCount()
使用集合元数据,而不是扫描整个集合。
estimatedDocumentCount()
不接受过滤器。 Model.find({ foo: bar }).estimatedDocumentCount()
等同于 Model.find().estimatedDocumentCount()
此函数触发以下中间件。
estimatedDocumentCount()
示例
await Model.find().estimatedDocumentCount();
Query.prototype.exec()
参数
[operation]
«字符串|函数»
返回值
- «Promise»
Query.prototype.exists()
参数
[path]
«String»val
«布尔值»
返回值
- «Query» this
参见
指定 $exists
条件
示例
// { name: { $exists: true }}
Thing.where('name').exists()
Thing.where('name').exists(true)
Thing.find().exists('name')
// { name: { $exists: false }}
Thing.where('name').exists(false);
Thing.find().exists('name', false);
Query.prototype.explain()
参数
[verbose]
«字符串» 详细程度模式。可以是 'queryPlanner'、'executionStats' 或 'allPlansExecution'。默认值为 'queryPlanner'
返回值
- «Query» this
设置 explain
选项,这将使此查询返回详细的执行统计信息,而不是实际的查询结果。此方法有助于确定查询使用什么索引。
调用 query.explain(v)
等同于 query.setOptions({ explain: v })
示例
const query = new Query();
const res = await query.find({ a: 1 }).explain('queryPlanner');
console.log(res);
Query.prototype.finally()
参数
[onFinally]
«函数»
返回值
- «Promise»
执行查询,返回一个 Promise
,该 Promise
将使用 .finally()
链式解析。
有关 JavaScript 中 Promise finally()
的更多信息。
Query.prototype.find()
参数
[filter]
«对象|ObjectId» mongodb 过滤器。如果未指定,则返回所有文档。
返回值
- «Query» this
查找与 selector
匹配的所有文档。结果将是文档数组。
如果结果中的文档太多而无法容纳在内存中,请使用 Query.prototype.cursor()
示例
const arr = await Movie.find({ year: { $gte: 1980, $lte: 1989 } });
Query.prototype.findOne()
参数
[filter]
«Object» mongodb 选择器[projection]
«对象» 要返回的可选字段[options]
«对象» 请参见setOptions()
[options.translateAliases=null]
«布尔值» 如果设置为true
,则会将filter
、projection
、update
和distinct
中的任何模式定义的别名进行转换。如果在同一个对象上同时定义了别名和原始属性,则会抛出错误。
返回值
- «Query» this
参见
将查询声明为 findOne 操作。执行后,第一个找到的文档将传递给回调函数。
查询结果是单个文档,如果未找到文档,则为 null
。
- 注意:
conditions
是可选的,如果conditions
为 null 或未定义,则 mongoose 会向 MongoDB 发送一个空findOne
命令,该命令将返回一个任意文档。如果您按_id
查询,请改用Model.findById()
。
此函数触发以下中间件。
findOne()
示例
const query = Kitten.where({ color: 'white' });
const kitten = await query.findOne();
Query.prototype.findOneAndDelete()
参数
[filter]
«对象»[options]
«Object»[options.includeResultMetadata]
«布尔值» 如果为 true,则返回完整的 来自 MongoDB 驱动程序的 ModifyResult,而不仅仅是文档[options.session=null]
«ClientSession» 与此查询关联的会话。请参见 事务文档。[options.strict]
«布尔值|字符串» 覆盖模式的 严格模式选项
返回值
- «Query» this
参见
发出一个 MongoDB findOneAndDelete 命令。
查找匹配的文档,将其删除,并返回找到的文档(如果有)。
此函数触发以下中间件。
findOneAndDelete()
可用选项
sort
:如果根据条件找到多个文档,则设置排序顺序以选择要更新的文档maxTimeMS
:为查询设置时间限制 - 需要 mongodb >= 2.6.0
回调签名
function(error, doc) {
// error: any errors that occurred
// doc: the document before updates are applied if `new: false`, or after updates if `new = true`
}
示例
A.where().findOneAndDelete(conditions, options) // return Query
A.where().findOneAndDelete(conditions) // returns Query
A.where().findOneAndDelete() // returns Query
Query.prototype.findOneAndReplace()
参数
[filter]
«对象»[replacement]
«对象»[options]
«Object»[options.includeResultMetadata]
«布尔值» 如果为 true,则返回完整的 来自 MongoDB 驱动程序的 ModifyResult,而不仅仅是文档[options.session=null]
«ClientSession» 与此查询关联的会话。请参见 事务文档。[options.strict]
«布尔值|字符串» 覆盖模式的 严格模式选项[options.new=false]
«布尔值» 默认情况下,findOneAndUpdate()
返回在应用update
之前的文档。如果将new: true
设置为,findOneAndUpdate()
将改为返回应用update
后的对象。[options.lean]
«对象» 如果为真值,mongoose 将返回纯 JavaScript 对象,而不是 mongoose 文档。请参见Query.lean()
和 Mongoose lean 教程。[options.session=null]
«ClientSession» 与此查询关联的会话。请参见 事务文档。[options.strict]
«布尔值|字符串» 覆盖模式的 严格模式选项[options.timestamps=null]
«布尔值» 如果设置为false
并且启用了 模式级时间戳,则跳过此更新的时间戳。请注意,这允许您覆盖时间戳。如果未设置模式级时间戳,则不会执行任何操作。[options.returnOriginal=null]
«布尔值»new
选项的别名。returnOriginal: false
等同于new: true
。[options.translateAliases=null]
«布尔值» 如果设置为true
,则会将filter
、projection
、update
和distinct
中的任何模式定义的别名进行转换。如果在同一个对象上同时定义了别名和原始属性,则会抛出错误。
返回值
- «Query» this
发出一个 MongoDB findOneAndReplace 命令。
查找匹配的文档,将其删除,并返回找到的文档(如果有)。
此函数触发以下中间件。
findOneAndReplace()
可用选项
sort
:如果根据条件找到多个文档,则设置排序顺序以选择要更新的文档maxTimeMS
:为查询设置时间限制 - 需要 mongodb >= 2.6.0includeResultMetadata
:如果为 true,则返回完整的 来自 MongoDB 驱动程序的 ModifyResult,而不仅仅是文档
回调签名
function(error, doc) {
// error: any errors that occurred
// doc: the document before updates are applied if `new: false`, or after updates if `new = true`
}
示例
A.where().findOneAndReplace(filter, replacement, options); // return Query
A.where().findOneAndReplace(filter); // returns Query
A.where().findOneAndReplace(); // returns Query
Query.prototype.findOneAndUpdate()
参数
[filter]
«Object|Query»[doc]
«对象»[options]
«Object»[options.includeResultMetadata]
«布尔值» 如果为 true,则返回完整的 来自 MongoDB 驱动程序的 ModifyResult,而不仅仅是文档[options.strict]
«布尔值|字符串» 覆盖模式的 严格模式选项[options.session=null]
«ClientSession» 与此查询关联的会话。请参见 事务文档。[options.multipleCastError]
«布尔值» 默认情况下,mongoose 仅返回在强制转换查询时发生的第一个错误。启用此选项以聚合所有强制转换错误。[options.new=false]
«布尔值» 默认情况下,findOneAndUpdate()
返回在应用update
之前的文档。如果将new: true
设置为,findOneAndUpdate()
将改为返回应用update
后的对象。[options.lean]
«对象» 如果为真值,mongoose 将返回纯 JavaScript 对象,而不是 mongoose 文档。请参见Query.lean()
和 Mongoose lean 教程。[options.session=null]
«ClientSession» 与此查询关联的会话。请参见 事务文档。[options.strict]
«布尔值|字符串» 覆盖模式的 严格模式选项[options.timestamps=null]
«布尔值» 如果设置为false
并且启用了 模式级时间戳,则跳过此更新的时间戳。请注意,这允许您覆盖时间戳。如果未设置模式级时间戳,则不会执行任何操作。[options.returnOriginal=null]
«布尔值»new
选项的别名。returnOriginal: false
等同于new: true
。[options.translateAliases=null]
«布尔值» 如果设置为true
,则会将filter
、projection
、update
和distinct
中的任何模式定义的别名进行转换。如果在同一个对象上同时定义了别名和原始属性,则会抛出错误。[options.overwriteDiscriminatorKey=false]
«布尔值» 默认情况下,Mongoose 会从update
中删除鉴别符键更新,将overwriteDiscriminatorKey
设置为true
以允许更新鉴别符键
返回值
- «Query» this
参见
发出一个 mongodb findOneAndUpdate()
命令。
查找匹配的文档,根据 update
参数更新它,传递任何 options
,并返回找到的文档(如果有)。
此函数触发以下中间件。
findOneAndUpdate()
可用选项
new
:bool - 如果为 true,则返回修改后的文档,而不是原始文档。默认值为 false(在 4.0 中更改)upsert
:bool - 如果不存在,则创建对象。默认值为 false。fields
:{对象|字符串} - 字段选择。等同于.select(fields).findOneAndUpdate()
sort
:如果根据条件找到多个文档,则设置排序顺序以选择要更新的文档maxTimeMS
:为查询设置时间限制 - 需要 mongodb >= 2.6.0runValidators
:如果为 true,则运行 更新验证器 以执行此命令。更新验证器会根据模型的模式验证更新操作。setDefaultsOnInsert
:默认值为true
。如果setDefaultsOnInsert
和upsert
为 true,则 mongoose 会在创建新文档时应用模型模式中指定的 默认值。
示例
query.findOneAndUpdate(conditions, update, options) // returns Query
query.findOneAndUpdate(conditions, update) // returns Query
query.findOneAndUpdate(update) // returns Query
query.findOneAndUpdate() // returns Query
Query.prototype.geometry()
参数
object
«对象» 必须包含一个type
属性(字符串类型)和一个coordinates
属性(数组类型)。请参见示例。
返回值
- «Query» this
参见
指定 $geometry
条件
示例
const polyA = [[[ 10, 20 ], [ 10, 40 ], [ 30, 40 ], [ 30, 20 ]]]
query.where('loc').within().geometry({ type: 'Polygon', coordinates: polyA })
// or
const polyB = [[ 0, 0 ], [ 1, 1 ]]
query.where('loc').within().geometry({ type: 'LineString', coordinates: polyB })
// or
const polyC = [ 0, 0 ]
query.where('loc').within().geometry({ type: 'Point', coordinates: polyC })
// or
query.where('loc').intersects().geometry({ type: 'Point', coordinates: polyC })
该参数将被分配给传递给 where()
的最新路径。
注意
geometry()
必须位于 intersects()
或 within()
之后。
object
参数必须包含 type
和 coordinates
属性。
- type {字符串}
- coordinates {数组}
Query.prototype.get()
参数
path
«字符串|对象» 要获取的路径或键/值对对象
返回值
- «Query» this
对于更新操作,返回更新 $set
中路径的值。有助于编写可以在更新操作和 save()
中使用的 getter/setter。
示例
const query = Model.updateOne({}, { $set: { name: 'Jean-Luc Picard' } });
query.get('name'); // 'Jean-Luc Picard'
Query.prototype.getFilter()
返回值
- «对象» 当前查询过滤器
返回当前查询过滤器(也称为条件)作为 POJO。
示例
const query = new Query();
query.find({ a: 1 }).where('b').gt(2);
query.getFilter(); // { a: 1, b: { $gt: 2 } }
Query.prototype.getOptions()
返回值
- «对象» 选项
获取查询选项。
示例
const query = new Query();
query.limit(10);
query.setOptions({ maxTimeMS: 1000 });
query.getOptions(); // { limit: 10, maxTimeMS: 1000 }
Query.prototype.getPopulatedPaths()
返回值
- «数组» 表示已填充路径的字符串数组
获取此查询要填充的路径列表
示例
bookSchema.pre('findOne', function() {
let keys = this.getPopulatedPaths(); // ['author']
});
...
Book.findOne({}).populate('author');
示例
// Deep populate
const q = L1.find().populate({
path: 'level2',
populate: { path: 'level3' }
});
q.getPopulatedPaths(); // ['level2', 'level2.level3']
Query.prototype.getQuery()
返回值
- «对象» 当前查询过滤器
返回当前查询过滤器。等同于 getFilter()
。
您应尽可能使用 getFilter()
而不是 getQuery()
。getQuery()
可能会在将来的版本中被弃用。
示例
const query = new Query();
query.find({ a: 1 }).where('b').gt(2);
query.getQuery(); // { a: 1, b: { $gt: 2 } }
Query.prototype.getUpdate()
返回值
- «对象» 当前更新操作
以 JSON 对象形式返回当前更新操作。
示例
const query = new Query();
query.updateOne({}, { $set: { a: 5 } });
query.getUpdate(); // { $set: { a: 5 } }
Query.prototype.gt()
参数
[path]
«String»val
«Number»
参见
指定 $gt
查询条件。
当使用一个参数调用时,将使用传递给 where()
的最新路径。
示例
Thing.find().where('age').gt(21);
// or
Thing.find().gt('age', 21);
Query.prototype.gte()
参数
[path]
«String»val
«Number»
参见
指定 $gte
查询条件。
当使用一个参数调用时,将使用传递给 where()
的最新路径。
Query.prototype.hint()
参数
val
«对象» 提示对象
返回值
- «Query» this
参见
Query.prototype.in()
参数
[path]
«String»val
«Array»
参见
指定 $in
查询条件。
当使用一个参数调用时,将使用传递给 where()
的最新路径。
Query.prototype.intersects()
参数
[arg]
«对象»
返回值
- «Query» this
参见
为 geometry()
声明一个 intersects 查询。
示例
query.where('path').intersects().geometry({
type: 'LineString',
coordinates: [[180.0, 11.0], [180, 9.0]]
});
query.where('path').intersects({
type: 'LineString',
coordinates: [[180.0, 11.0], [180, 9.0]]
});
注意
必须在 where()
之后使用。
注意
在 Mongoose 3.7 中,intersects
从 getter 变成了函数。如果您需要旧语法,请使用 此方法。
Query.prototype.isPathSelectedInclusive()
参数
path
«字符串»
返回值
- «布尔值»
包装函数,用于在查询上调用 isPathSelectedInclusive。
Query.prototype.j()
参数
val
«布尔值»
返回值
- «Query» this
参见
请求确认此操作已持久保存到 MongoDB 的磁盘日志中。此选项仅对写入数据库的操作有效
deleteOne()
deleteMany()
findOneAndDelete()
findOneAndReplace()
findOneAndUpdate()
updateOne()
updateMany()
默认为模式的 writeConcern.j
选项
示例
await mongoose.model('Person').deleteOne({ name: 'Ned Stark' }).j(true);
Query.prototype.lean()
参数
bool
«布尔值|对象» 默认值为 true
返回值
- «Query» this
设置 lean 选项。
从启用 lean
选项的查询中返回的文档是纯 JavaScript 对象,而不是 Mongoose 文档。它们没有 save
方法、getter/setter、虚拟属性或其他 Mongoose 功能。
示例
new Query().lean() // true
new Query().lean(true)
new Query().lean(false)
const docs = await Model.find().lean();
docs[0] instanceof mongoose.Document; // false
Lean 非常适合高性能的只读情况,尤其是在与 游标 结合使用时。
如果您需要使用 lean()
来使用虚拟属性、getter/setter 或默认值,则需要使用插件。请参见
Query.prototype.limit()
参数
val
«Number»
Query.prototype.lt()
参数
[path]
«String»val
«Number»
参见
指定 $lt
查询条件。
当使用一个参数调用时,将使用传递给 where()
的最新路径。
Query.prototype.lte()
参数
[path]
«String»val
«Number»
参见
指定 $lte
查询条件。
当使用一个参数调用时,将使用传递给 where()
的最新路径。
Query.prototype.maxDistance()
参数
[path]
«String»val
«Number»
参见
指定 maxDistance
查询条件。
当使用一个参数调用时,将使用传递给 where()
的最新路径。
Query.prototype.maxTimeMS()
参数
[ms]
«数字» 毫秒数
返回值
- «Query» this
设置 maxTimeMS 选项。这将告诉 MongoDB 服务器,如果查询或写入操作运行时间超过 ms
毫秒,则中止操作。
调用 query.maxTimeMS(v)
等同于 query.setOptions({ maxTimeMS: v })
示例
const query = new Query();
// Throws an error 'operation exceeded time limit' as long as there's
// >= 1 doc in the queried collection
const res = await query.find({ $where: 'sleep(1000) || true' }).maxTimeMS(100);
Query.prototype.merge()
参数
source
«查询|对象»
返回值
- «Query» this
将另一个查询或条件对象合并到此查询中。
当传递一个查询时,条件、字段选择和选项将被合并。
Query.prototype.mod()
参数
[path]
«String»val
«数组» 必须包含 2 个元素,第一个元素是divisor
,第二个元素是remainder
。
返回值
- «Query» this
参见
指定 $mod
条件,为其 path
属性为数字(等于 remainder
模 divisor
)的文档过滤文档。
示例
// All find products whose inventory is odd
Product.find().mod('inventory', [2, 1]);
Product.find().where('inventory').mod([2, 1]);
// This syntax is a little strange, but supported.
Product.find().where('inventory').mod(2, 1);
Query.prototype.model
类型
- «属性»
Query.prototype.mongooseOptions()
参数
options
«对象» 如果指定,则覆盖当前选项
返回值
- «对象» 选项
围绕此查询的当前 mongoose 特定选项的 getter/setter。以下是当前的 Mongoose 特定选项。
populate
:表示要填充哪些路径的数组。应为Query.prototype.populate()
的每次调用包含一个条目lean
:如果为真值,则 Mongoose 不会 填充 从此查询返回的任何文档。有关更多信息,请参见Query.prototype.lean()
。strict
: 控制 Mongoose 如何处理更新时不在模式中的键。此选项默认情况下为true
,这意味着 Mongoose 会静默地删除更新中不在模式中的任何路径。有关更多信息,请参阅strict
模式文档。strictQuery
: 控制 Mongoose 如何处理查询filter
中不在模式中的键。此选项默认情况下为false
,这意味着 Mongoose 允许Model.find({ foo: 'bar' })
,即使foo
不在模式中。有关更多信息,请参阅strictQuery
文档。nearSphere
: 使用$nearSphere
代替near()
。请参阅Query.prototype.nearSphere()
文档
Mongoose 为内部选项维护一个单独的对象,因为 Mongoose 将 Query.prototype.options
发送到 MongoDB 服务器,并且上述选项与 MongoDB 服务器无关。
Query.prototype.ne()
参数
[path]
«String»val
«any»
参见
指定 $ne
查询条件。
当使用一个参数调用时,将使用传递给 where()
的最新路径。
Query.prototype.near()
参数
[path]
«String»val
«Object»
返回值
- «Query» this
参见
指定 $near
或 $nearSphere
条件
这些运算符返回按距离排序的文档。
示例
query.where('loc').near({ center: [10, 10] });
query.where('loc').near({ center: [10, 10], maxDistance: 5 });
query.where('loc').near({ center: [10, 10], maxDistance: 5, spherical: true });
query.near('loc', { center: [10, 10], maxDistance: 5 });
Query.prototype.nearSphere()
~已弃用~参见
已弃用 指定 $nearSphere
条件
示例
query.where('loc').nearSphere({ center: [10, 10], maxDistance: 5 });
已弃用。 使用 query.near()
代替,并将 spherical
选项设置为 true
。
示例
query.where('loc').near({ center: [10, 10], spherical: true });
Query.prototype.nin()
参数
[path]
«String»val
«Array»
参见
指定 $nin
查询条件。
当使用一个参数调用时,将使用传递给 where()
的最新路径。
Query.prototype.nor()
参数
array
«Array» 条件数组
返回值
- «Query» this
参见
Query.prototype.or()
参数
array
«Array» 条件数组
返回值
- «Query» this
参见
Query.prototype.orFail()
参数
[err]
«Function|Error» 如果没有文档与filter
匹配,则要抛出的可选错误。如果未指定,orFail()
将抛出DocumentNotFoundError
返回值
- «Query» this
如果没有任何文档与给定的 filter
匹配,则使此查询抛出错误。这对于与 async/await 集成非常方便,因为 orFail()
可以为您省去一个额外的 if
语句来检查是否没有找到文档。
示例
// Throws if no doc returned
await Model.findOne({ foo: 'bar' }).orFail();
// Throws if no document was updated. Note that `orFail()` will still
// throw if the only document that matches is `{ foo: 'bar', name: 'test' }`,
// because `orFail()` will throw if no document was _updated_, not
// if no document was _found_.
await Model.updateOne({ foo: 'bar' }, { name: 'test' }).orFail();
// Throws "No docs found!" error if no docs match `{ foo: 'bar' }`
await Model.find({ foo: 'bar' }).orFail(new Error('No docs found!'));
// Throws "Not found" error if no document was found
await Model.findOneAndUpdate({ foo: 'bar' }, { name: 'test' }).
orFail(() => Error('Not found'));
Query.prototype.polygon()
参数
[path]
«String|Array»[...coordinatePairs]
«Array|Object»
返回值
- «Query» this
参见
指定 $polygon
条件
示例
query.where('loc').within().polygon([10, 20], [13, 25], [7, 15]);
query.polygon('loc', [10, 20], [13, 25], [7, 15]);
Query.prototype.populate()
参数
path
«Object|String|Array[String]» 要填充的路径或指定所有参数的对象[select]
«Object|String» 填充查询的字段选择[model]
«Model» 您希望用于填充的模型。如果未指定,填充将根据模式的ref
字段中的名称查找模型。[match]
«Object» 填充查询的条件[options]
«Object» 填充查询的选项(排序等)[options.path=null]
«String» 要填充的路径。[options.retainNullValues=false]
«boolean» 默认情况下,Mongoose 会从填充的数组中删除空值和未定义值。使用此选项使populate()
保留null
和undefined
数组条目。[options.getters=false]
«boolean» 如果为 true,Mongoose 将调用localField
上定义的任何 getter。默认情况下,Mongoose 获取localField
的原始值。例如,如果您想 向您的localField
添加lowercase
getter,则需要将此选项设置为true
。[options.clone=false]
«boolean» 当您执行BlogPost.find().populate('author')
时,具有相同作者的博客文章将共享author
文档的 1 个副本。启用此选项以使 Mongoose 在分配填充的文档之前克隆它们。[options.match=null]
«Object|Function» 向填充查询添加额外的过滤器。可以是包含 MongoDB 查询语法 的过滤器对象,也可以是返回过滤器对象的函数。[options.transform=null]
«Function» Mongoose 将在每个填充的文档上调用的函数,允许您转换填充的文档。[options.options=null]
«Object» 其他选项,如limit
和lean
。
返回值
- «Query» this
参见
指定应使用其他文档填充的路径。
示例
let book = await Book.findOne().populate('authors');
book.title; // 'Node.js in Action'
book.authors[0].name; // 'TJ Holowaychuk'
book.authors[1].name; // 'Nathan Rajlich'
let books = await Book.find().populate({
path: 'authors',
// `match` and `sort` apply to the Author model,
// not the Book model. These options do not affect
// which documents are in `books`, just the order and
// contents of each book document's `authors`.
match: { name: new RegExp('.*h.*', 'i') },
sort: { name: -1 }
});
books[0].title; // 'Node.js in Action'
// Each book's `authors` are sorted by name, descending.
books[0].authors[0].name; // 'TJ Holowaychuk'
books[0].authors[1].name; // 'Marc Harter'
books[1].title; // 'Professional AngularJS'
// Empty array, no authors' name has the letter 'h'
books[1].authors; // []
路径在查询执行并收到响应后进行填充。然后,将为每个为填充指定的路径执行单独的查询。在每个查询的响应也返回后,结果将传递给回调。
Query.prototype.post()
参数
fn
«Function»
返回值
- «Promise»
向此查询实例添加后 中间件。不会影响其他查询。
示例
const q1 = Question.find({ answer: 42 });
q1.post(function middleware() {
console.log(this.getFilter());
});
await q1.exec(); // Prints "{ answer: 42 }"
// Doesn't print anything, because `middleware()` is only
// registered on `q1`.
await Question.find({ answer: 42 });
Query.prototype.pre()
参数
fn
«Function»
返回值
- «Promise»
向此查询实例添加前 中间件。不会影响其他查询。
示例
const q1 = Question.find({ answer: 42 });
q1.pre(function middleware() {
console.log(this.getFilter());
});
await q1.exec(); // Prints "{ answer: 42 }"
// Doesn't print anything, because `middleware()` is only
// registered on `q1`.
await Question.find({ answer: 42 });
Query.prototype.projection()
参数
arg
«Object|null»
返回值
- «Object» 当前投影
获取/设置当前投影(又称字段)。传递 null
以删除当前投影。
与 projection()
不同,select()
函数会就地修改当前投影。此函数会覆盖现有的投影。
示例
const q = Model.find();
q.projection(); // null
q.select('a b');
q.projection(); // { a: 1, b: 1 }
q.projection({ c: 1 });
q.projection(); // { c: 1 }
q.projection(null);
q.projection(); // null
Query.prototype.read()
参数
mode
«String» 列出的首选项选项之一或别名[tags]
«Array» 此查询的可选标签
返回值
- «Query» this
参见
确定要从中读取的 MongoDB 节点。
Preferences
primary - (default) Read from primary only. Operations will produce an error if primary is unavailable. Cannot be combined with tags.
secondary Read from secondary if available, otherwise error.
primaryPreferred Read from primary if available, otherwise a secondary.
secondaryPreferred Read from a secondary if available, otherwise read from the primary.
nearest All operations read from among the nearest candidates, but unlike other modes, this option will include both the primary and all secondaries in the random selection.
Aliases
p primary
pp primaryPreferred
s secondary
sp secondaryPreferred
n nearest
示例
new Query().read('primary')
new Query().read('p') // same as primary
new Query().read('primaryPreferred')
new Query().read('pp') // same as primaryPreferred
new Query().read('secondary')
new Query().read('s') // same as secondary
new Query().read('secondaryPreferred')
new Query().read('sp') // same as secondaryPreferred
new Query().read('nearest')
new Query().read('n') // same as nearest
// read from secondaries with matching tags
new Query().read('s', [{ dc:'sf', s: 1 },{ dc:'ma', s: 2 }])
详细了解如何使用读首选项 此处。
Query.prototype.readConcern()
参数
level
«String» 列出的读关注级别之一或其别名
返回值
- «Query» this
参见
为查询设置 readConcern 选项。
示例
new Query().readConcern('local')
new Query().readConcern('l') // same as local
new Query().readConcern('available')
new Query().readConcern('a') // same as available
new Query().readConcern('majority')
new Query().readConcern('m') // same as majority
new Query().readConcern('linearizable')
new Query().readConcern('lz') // same as linearizable
new Query().readConcern('snapshot')
new Query().readConcern('s') // same as snapshot
Read Concern Level
local MongoDB 3.2+ The query returns from the instance with no guarantee guarantee that the data has been written to a majority of the replica set members (i.e. may be rolled back).
available MongoDB 3.6+ The query returns from the instance with no guarantee guarantee that the data has been written to a majority of the replica set members (i.e. may be rolled back).
majority MongoDB 3.2+ The query returns the data that has been acknowledged by a majority of the replica set members. The documents returned by the read operation are durable, even in the event of failure.
linearizable MongoDB 3.4+ The query returns data that reflects all successful majority-acknowledged writes that completed prior to the start of the read operation. The query may wait for concurrently executing writes to propagate to a majority of replica set members before returning results.
snapshot MongoDB 4.0+ Only available for operations within multi-document transactions. Upon transaction commit with write concern "majority", the transaction operations are guaranteed to have read from a snapshot of majority-committed data.
Aliases
l local
a available
m majority
lz linearizable
s snapshot
详细了解如何使用读关注 此处。
Query.prototype.regex()
参数
[path]
«String»val
«String|RegExp»
参见
指定 $regex
查询条件。
当使用一个参数调用时,将使用传递给 where()
的最新路径。
Query.prototype.replaceOne()
参数
[filter]
«对象»[doc]
«Object» 更新命令[options]
«Object»[options.multipleCastError]
«布尔值» 默认情况下,mongoose 仅返回在强制转换查询时发生的第一个错误。启用此选项以聚合所有强制转换错误。[options.strict]
«布尔值|字符串» 覆盖模式的 严格模式选项[options.upsert=false]
«Boolean» 如果为 true,并且没有找到文档,则插入新文档[options.timestamps=null]
«Boolean» 如果设置为false
并且 模式级时间戳 已启用,则跳过此更新的时间戳。如果模式级时间戳未设置,则不会执行任何操作。[options.translateAliases=null]
«布尔值» 如果设置为true
,则会将filter
、projection
、update
和distinct
中的任何模式定义的别名进行转换。如果在同一个对象上同时定义了别名和原始属性,则会抛出错误。[callback]
«Function» 参数为 (error, writeOpResult)
返回值
- «Query» this
参见
声明此查询并将其执行为 replaceOne() 操作。MongoDB 将替换现有文档,并且不会接受任何 原子运算符 ($set
等)。
注意 replaceOne 不会 触发更新中间件。请改用 pre('replaceOne')
和 post('replaceOne')
。
示例
const res = await Person.replaceOne({ _id: 24601 }, { name: 'Jean Valjean' });
res.acknowledged; // Indicates if this write result was acknowledged. If not, then all other members of this result will be undefined.
res.matchedCount; // Number of documents that matched the filter
res.modifiedCount; // Number of documents that were modified
res.upsertedCount; // Number of documents that were upserted
res.upsertedId; // Identifier of the inserted document (if an upsert took place)
此函数触发以下中间件。
replaceOne()
Query.prototype.sanitizeProjection()
参数
value
«Boolean»
返回值
- «Query» this
参见
设置此查询的 sanitizeProjection
选项。如果设置,sanitizeProjection
将执行两件事
- 强制投影值为数字,而不是字符串。
- 阻止使用
+
语法覆盖默认情况下取消选择的属性。
使用 sanitizeProjection()
,您可以将潜在的不受信任的用户数据传递给 .select()
。
示例
const userSchema = new Schema({
name: String,
password: { type: String, select: false }
});
const UserModel = mongoose.model('User', userSchema);
const { _id } = await UserModel.create({ name: 'John', password: 'secret' })
// The MongoDB server has special handling for string values that start with '$'
// in projections, which can lead to unexpected leaking of sensitive data.
let doc = await UserModel.findOne().select({ name: '$password' });
doc.name; // 'secret'
doc.password; // undefined
// With `sanitizeProjection`, Mongoose forces all projection values to be numbers
doc = await UserModel.findOne().sanitizeProjection(true).select({ name: '$password' });
doc.name; // 'John'
doc.password; // undefined
// By default, Mongoose supports projecting in `password` using `+password`
doc = await UserModel.findOne().select('+password');
doc.password; // 'secret'
// With `sanitizeProjection`, Mongoose prevents projecting in `password` and other
// fields that have `select: false` in the schema.
doc = await UserModel.findOne().sanitizeProjection(true).select('+password');
doc.password; // undefined
Query.prototype.select()
参数
arg
«Object|String|Array[String]»
返回值
- «Query» this
参见
指定要包含或排除的文档字段(也称为查询“投影”)
使用字符串语法时,在路径前加 -
将标记该路径为排除。当路径没有 -
前缀时,它将被包含。最后,如果路径前缀为 +
,则它强制包含路径,这对于在 模式级别 上被排除的路径很有用。
投影必须是包含式或排除式。换句话说,您必须列出要包含的字段(这将排除所有其他字段),或者列出要排除的字段(这意味着所有其他字段都将被包含)。_id
字段是唯一的例外,因为 MongoDB 默认情况下会包含它。
示例
// include a and b, exclude other fields
query.select('a b');
// Equivalent syntaxes:
query.select(['a', 'b']);
query.select({ a: 1, b: 1 });
// exclude c and d, include other fields
query.select('-c -d');
// Use `+` to override schema-level `select: false` without making the
// projection inclusive.
const schema = new Schema({
foo: { type: String, select: false },
bar: String
});
// ...
query.select('+foo'); // Override foo's `select: false` without excluding `bar`
// or you may use object notation, useful when
// you have keys already prefixed with a "-"
query.select({ a: 1, b: 1 });
query.select({ c: 0, d: 0 });
Additional calls to select can override the previous selection:
query.select({ a: 1, b: 1 }).select({ b: 0 }); // selection is now { a: 1 }
query.select({ a: 0, b: 0 }).select({ b: 1 }); // selection is now { a: 0 }
Query.prototype.selected()
返回值
- «布尔值»
确定是否已进行字段选择。
Query.prototype.selectedExclusively()
返回值
- «布尔值»
确定是否已进行排除式字段选择。
query.selectedExclusively(); // false
query.select('-name');
query.selectedExclusively(); // true
query.selectedInclusively(); // false
Query.prototype.selectedInclusively()
返回值
- «布尔值»
确定是否已进行包含式字段选择。
query.selectedInclusively(); // false
query.select('name');
query.selectedInclusively(); // true
Query.prototype.session()
参数
[session]
«ClientSession» 来自await conn.startSession()
返回值
- «Query» this
参见
设置与此查询关联的 MongoDB 会话。会话是您将查询标记为 事务 的一部分的方式。
调用 session(null)
会从此查询中删除会话。
示例
const s = await mongoose.startSession();
await mongoose.model('Person').findOne({ name: 'Axl Rose' }).session(s);
Query.prototype.set()
参数
path
«String|Object» 要设置的路径或键/值对对象[val]
«Any» 要设置的值
返回值
- «Query» this
向此查询的更新添加 $set
,而不会更改操作。这对查询中间件很有用,因此您可以添加更新,无论您使用 updateOne()
、updateMany()
、findOneAndUpdate()
等。
示例
// Updates `{ $set: { updatedAt: new Date() } }`
new Query().updateOne({}, {}).set('updatedAt', new Date());
new Query().updateMany({}, {}).set({ updatedAt: new Date() });
Query.prototype.setOptions()
参数
options
«Object»
返回值
- «Query» this
设置查询选项。某些选项只对某些操作有意义。
Options
以下选项仅适用于 find()
以下选项仅适用于写入操作:updateOne()
、updateMany()
、replaceOne()
、findOneAndUpdate()
和 findByIdAndUpdate()
- upsert
- writeConcern
- timestamps: 如果在模式中设置了
timestamps
,请将此选项设置为false
以跳过该特定更新的时间戳。如果在模式选项中未启用timestamps
,则不会产生任何影响。 - overwriteDiscriminatorKey: 允许在更新中设置鉴别器键。如果更新更改了鉴别器键,则将使用正确的鉴别器模式。
以下选项仅适用于 find()
、findOne()
、findById()
、findOneAndUpdate()
、findOneAndReplace()
、findOneAndDelete()
和 findByIdAndUpdate()
- lean
- populate
- projection
- sanitizeProjection
- useBigInt64
以下选项仅适用于所有操作,除了 updateOne()
、updateMany()
、deleteOne()
和 deleteMany()
以下选项适用于 find()
、findOne()
、findOneAndUpdate()
、findOneAndDelete()
、updateOne()
和 deleteOne()
以下选项适用于 findOneAndUpdate()
和 findOneAndDelete()
- includeResultMetadata
以下选项适用于所有操作
Query.prototype.setQuery()
参数
new
«Object» 查询条件
返回值
- «undefined,void»
将查询条件设置为提供的 JSON 对象。
示例
const query = new Query();
query.find({ a: 1 })
query.setQuery({ a: 2 });
query.getQuery(); // { a: 2 }
Query.prototype.setUpdate()
参数
new
«Object» 更新操作
返回值
- «undefined,void»
将当前更新操作设置为新值。
示例
const query = new Query();
query.updateOne({}, { $set: { a: 5 } });
query.setUpdate({ $set: { b: 6 } });
query.getUpdate(); // { $set: { b: 6 } }
Query.prototype.size()
参数
[path]
«String»val
«Number»
参见
指定 $size
查询条件。
当使用一个参数调用时,将使用传递给 where()
的最新路径。
示例
const docs = await MyModel.where('tags').size(0).exec();
assert(Array.isArray(docs));
console.log('documents with 0 tags', docs);
Query.prototype.skip()
参数
val
«Number»
参见
Query.prototype.slice()
参数
[path]
«String»val
«Number|Array» 要切片的元素数量或包含要跳过的元素数量和要切片的元素数量的数组
返回值
- «Query» this
参见
为数组指定 $slice
投影。
示例
query.slice('comments', 5); // Returns the first 5 comments
query.slice('comments', -5); // Returns the last 5 comments
query.slice('comments', [10, 5]); // Returns the first 5 comments after the 10-th
query.where('comments').slice(5); // Returns the first 5 comments
query.where('comments').slice([-10, 5]); // Returns the first 5 comments after the 10-th to last
注意:如果要切片的元素数量的绝对值大于数组中的元素数量,则将返回所有数组元素。
// Given `arr`: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
query.slice('arr', 20); // Returns [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
query.slice('arr', -20); // Returns [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
注意:如果要跳过的元素数量为正数且大于数组中的元素数量,则将返回空数组。
// Given `arr`: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
query.slice('arr', [20, 5]); // Returns []
注意:如果要跳过的元素数量为负数,并且其绝对值大于数组中的元素数量,则起始位置为数组的开头。
// Given `arr`: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
query.slice('arr', [-20, 5]); // Returns [1, 2, 3, 4, 5]
Query.prototype.sort()
参数
arg
«Object|String|Array<Array<string|number>>»[options]
«Object»[options.override=false]
«布尔值» 如果为真,则用arg
替换现有的排序选项。
返回值
- «Query» this
参见
设置排序顺序。
如果传递的是对象,则允许的值为 asc
、desc
、ascending
、descending
、1
和 -1
。
如果传递的是字符串,则它必须是一个空格分隔的路径名称列表。每个路径的排序顺序为升序,除非路径名称以 -
为前缀,则将被视为降序。
示例
// sort by "field" ascending and "test" descending
query.sort({ field: 'asc', test: -1 });
// equivalent
query.sort('field -test');
// also possible is to use a array with array key-value pairs
query.sort([['field', 'asc']]);
注意
不能与 distinct()
一起使用
Query.prototype.tailable()
参数
bool
«布尔值» 默认值为 true。[opts]
«对象» 要设置的选项。[opts.awaitData]
«布尔值» 默认值为 false。设置为 true 以使游标保持打开状态,即使没有数据。[opts.maxAwaitTimeMS]
«数字» 服务器等待新文档以满足可尾随游标查询的最大时间。要求tailable
和awaitData
为真。
参见
设置可尾随选项(用于带上限集合)。
示例
query.tailable(); // true
query.tailable(true);
query.tailable(false);
// Set both `tailable` and `awaitData` options
query.tailable({ awaitData: true });
注意
不能与 distinct()
一起使用
Query.prototype.then()
参数
[resolve]
«函数»[reject]
«Function»
返回值
- «Promise»
执行查询,返回一个 Promise
,该 Promise
将使用文档或错误进行解析。
有关 JavaScript 中的 then()
的更多信息。
Query.prototype.toConstructor()
返回值
- «查询» Query 的子类。
将此查询转换为具有所有参数和选项的自定义可重用查询构造函数。
示例
// Create a query for adventure movies and read from the primary
// node in the replica-set unless it is down, in which case we'll
// read from a secondary node.
const query = Movie.find({ tags: 'adventure' }).read('primaryPreferred');
// create a custom Query constructor based off these settings
const Adventure = query.toConstructor();
// further narrow down our query results while still using the previous settings
await Adventure().where({ name: /^Life/ }).exec();
// since Adventure is a stand-alone constructor we can also add our own
// helper methods and getters without impacting global queries
Adventure.prototype.startsWith = function (prefix) {
this.where({ name: new RegExp('^' + prefix) })
return this;
}
Object.defineProperty(Adventure.prototype, 'highlyRated', {
get: function () {
this.where({ rating: { $gt: 4.5 }});
return this;
}
})
await Adventure().highlyRated.startsWith('Life').exec();
Query.prototype.transform()
参数
fn
«函数» 要运行的函数,以转换查询结果。
返回值
- «Query» this
运行函数 fn
并将 fn
的返回值视为查询解析到的新值。
您传递给 transform()
的任何函数将在任何后置钩子 **之后** 运行。
示例
const res = await MyModel.findOne().transform(res => {
// Sets a `loadedAt` property on the doc that tells you the time the
// document was loaded.
return res == null ?
res :
Object.assign(res, { loadedAt: new Date() });
});
Query.prototype.updateMany()
参数
[filter]
«对象»[update]
«对象|数组» 更新命令。如果为数组,则此更新将被视为更新管道,而不是强制转换。[options]
«Object»[options.multipleCastError]
«布尔值» 默认情况下,mongoose 仅返回在强制转换查询时发生的第一个错误。启用此选项以聚合所有强制转换错误。[options.strict]
«布尔值|字符串» 覆盖模式的 严格模式选项[options.upsert=false]
«Boolean» 如果为 true,并且没有找到文档,则插入新文档[options.timestamps=null]
«Boolean» 如果设置为false
并且 模式级时间戳 已启用,则跳过此更新的时间戳。如果模式级时间戳未设置,则不会执行任何操作。[options.translateAliases=null]
«布尔值» 如果设置为true
,则会将filter
、projection
、update
和distinct
中的任何模式定义的别名进行转换。如果在同一个对象上同时定义了别名和原始属性,则会抛出错误。[options.overwriteDiscriminatorKey=false]
«布尔值» 默认情况下,Mongoose 会从update
中删除鉴别符键更新,将overwriteDiscriminatorKey
设置为true
以允许更新鉴别符键[callback]
«Function» 参数为 (error, writeOpResult)
返回值
- «Query» this
参见
声明和/或执行此查询作为 updateMany() 操作。MongoDB 将更新与 filter
匹配的 **所有** 文档(而不是仅第一个文档)。
**注意** updateMany **不会** 触发更新中间件。请改用 pre('updateMany')
和 post('updateMany')
。
示例
const res = await Person.updateMany({ name: /Stark$/ }, { isDeleted: true });
res.n; // Number of documents matched
res.nModified; // Number of documents modified
此函数触发以下中间件。
updateMany()
Query.prototype.updateOne()
参数
[filter]
«对象»[update]
«对象|数组» 更新命令。如果为数组,则此更新将被视为更新管道,而不是强制转换。[options]
«Object»[options.multipleCastError]
«布尔值» 默认情况下,mongoose 仅返回在强制转换查询时发生的第一个错误。启用此选项以聚合所有强制转换错误。[options.strict]
«布尔值|字符串» 覆盖模式的 严格模式选项[options.upsert=false]
«Boolean» 如果为 true,并且没有找到文档,则插入新文档[options.timestamps=null]
«布尔值» 如果设置为false
并且启用了 模式级时间戳,则跳过此更新的时间戳。请注意,这允许您覆盖时间戳。如果未设置模式级时间戳,则不会执行任何操作。[options.translateAliases=null]
«布尔值» 如果设置为true
,则会将filter
、projection
、update
和distinct
中的任何模式定义的别名进行转换。如果在同一个对象上同时定义了别名和原始属性,则会抛出错误。[options.overwriteDiscriminatorKey=false]
«布尔值» 默认情况下,Mongoose 会从update
中删除鉴别符键更新,将overwriteDiscriminatorKey
设置为true
以允许更新鉴别符键[callback]
«Function» 参数为 (error, writeOpResult)
返回值
- «Query» this
参见
声明和/或执行此查询作为 updateOne() 操作。MongoDB 将 **仅** 更新与 filter
匹配的第一个文档。
- 如果您想覆盖整个文档,而不是使用 原子运算符(如
$set
),请使用replaceOne()
。
**注意** updateOne **不会** 触发更新中间件。请改用 pre('updateOne')
和 post('updateOne')
。
示例
const res = await Person.updateOne({ name: 'Jean-Luc Picard' }, { ship: 'USS Enterprise' });
res.acknowledged; // Indicates if this write result was acknowledged. If not, then all other members of this result will be undefined.
res.matchedCount; // Number of documents that matched the filter
res.modifiedCount; // Number of documents that were modified
res.upsertedCount; // Number of documents that were upserted
res.upsertedId; // Identifier of the inserted document (if an upsert took place)
此函数触发以下中间件。
updateOne()
Query.prototype.w()
参数
val
«字符串|数字» 0 表示即发即弃,1 表示由一台服务器确认,'majority' 表示大多数副本集,或 任何更高级的选项。
返回值
- «Query» this
参见
设置必须确认此写入才能将此写入视为成功的 mongod
服务器数量或 mongod
服务器标记集。此选项仅对写入数据库的操作有效。
deleteOne()
deleteMany()
findOneAndDelete()
findOneAndReplace()
findOneAndUpdate()
updateOne()
updateMany()
默认值为架构的 writeConcern.w
选项
示例
// The 'majority' option means the `deleteOne()` promise won't resolve
// until the `deleteOne()` has propagated to the majority of the replica set
await mongoose.model('Person').
deleteOne({ name: 'Ned Stark' }).
w('majority');
Query.prototype.where()
参数
[path]
«字符串|对象»[val]
«任何»
返回值
- «Query» this
指定用于链式操作的 path
。
示例
// instead of writing:
User.find({age: {$gte: 21, $lte: 65}});
// we can instead write:
User.where('age').gte(21).lte(65);
// passing query conditions is permitted
User.find().where({ name: 'vonderful' })
// chaining
User
.where('age').gte(21).lte(65)
.where('name', /^vonderful/i)
.where('friends').slice(10)
.exec()
Query.prototype.within()
返回值
- «Query» this
参见
定义用于地理空间查询的 $within
或 $geoWithin
参数。
示例
query.where(path).within().box()
query.where(path).within().circle()
query.where(path).within().geometry()
query.where('loc').within({ center: [50,50], radius: 10, unique: true, spherical: true });
query.where('loc').within({ box: [[40.73, -73.9], [40.7, -73.988]] });
query.where('loc').within({ polygon: [[],[],[],[]] });
query.where('loc').within([], [], []) // polygon
query.where('loc').within([], []) // box
query.where('loc').within({ type: 'LineString', coordinates: [...] }); // geometry
必须在 where()
之后使用。
注意
从 Mongoose 3.7 开始,$geoWithin
始终用于查询。要更改此行为,请参阅 Query.use$geoWithin。
注意
在 Mongoose 3.7 中,within
从 getter 变为函数。如果您需要旧语法,请使用 此。
Query.prototype.writeConcern()
参数
writeConcern
«对象» 要设置的写入关注值。
返回值
- «Query» this
参见
设置此查询的 3 个写入关注参数。
w
: 设置必须确认此写入才能将此写入视为成功的mongod
服务器数量或mongod
服务器标记集。j
: 布尔值,设置为true
以请求确认此操作已持久保存到 MongoDB 的磁盘日志。wtimeout
: 如果w > 1
,则此写入在操作失败之前通过副本集传播的最大等待时间。默认值为0
,表示没有超时。
此选项仅对写入数据库的操作有效。
deleteOne()
deleteMany()
findOneAndDelete()
findOneAndReplace()
findOneAndUpdate()
updateOne()
updateMany()
默认值为架构的 writeConcern
选项
示例
// The 'majority' option means the `deleteOne()` promise won't resolve
// until the `deleteOne()` has propagated to the majority of the replica set
await mongoose.model('Person').
deleteOne({ name: 'Ned Stark' }).
writeConcern({ w: 'majority' });
Query.prototype.wtimeout()
参数
ms
«数字» 等待的毫秒数。
返回值
- «Query» this
参见
如果 w > 1
,则此写入在操作失败之前通过副本集传播的最大等待时间。默认值为 0
,表示没有超时。
此选项仅对写入数据库的操作有效。
deleteOne()
deleteMany()
findOneAndDelete()
findOneAndReplace()
findOneAndUpdate()
updateOne()
updateMany()
默认值为架构的 writeConcern.wtimeout
选项
示例
// The `deleteOne()` promise won't resolve until this `deleteOne()` has
// propagated to at least `w = 2` members of the replica set. If it takes
// longer than 1 second, this `deleteOne()` will fail.
await mongoose.model('Person').
deleteOne({ name: 'Ned Stark' }).
w(2).
wtimeout(1000);
Query.prototype[Symbol.asyncIterator]()
返回用于 for/await/of
循环 的异步迭代器。此函数 **仅** 对 find()
查询有效。您无需显式调用此函数,JavaScript 运行时将为您调用它。
示例
for await (const doc of Model.aggregate([{ $sort: { name: 1 } }])) {
console.log(doc.name);
}
Node.js 10.x 原生支持异步迭代器,无需任何标志。您可以使用 --harmony_async_iteration
标志 在 Node.js 8.x 中启用异步迭代器。
**注意:** 如果 Symbol.asyncIterator
未定义,则此函数无效。如果 Symbol.asyncIterator
未定义,则意味着您的 Node.js 版本不支持异步迭代器。
Query.prototype[Symbol.toStringTag]()
返回值
- «字符串»
返回此查询的字符串表示形式。
有关 JavaScript 中的 toString()
的更多信息。
示例
const q = Model.find();
console.log(q); // Prints "Query { find }"
Query.use$geoWithin
类型
- «属性»
参见
选择退出使用 $geoWithin
的标志。
mongoose.Query.use$geoWithin = false;
MongoDB 2.4 不推荐使用 $within
,并将其替换为 $geoWithin
。Mongoose 默认使用 $geoWithin
(与 $within
100% 向后兼容)。如果您运行的是旧版本的 MongoDB,请将此标志设置为 false
,以便您的 within()
查询继续工作。