聚合
Aggregate()
Aggregate.prototype.addFields()
Aggregate.prototype.allowDiskUse()
Aggregate.prototype.append()
Aggregate.prototype.catch()
Aggregate.prototype.collation()
Aggregate.prototype.count()
Aggregate.prototype.cursor()
Aggregate.prototype.densify()
Aggregate.prototype.exec()
Aggregate.prototype.explain()
Aggregate.prototype.facet()
Aggregate.prototype.fill()
Aggregate.prototype.finally()
Aggregate.prototype.graphLookup()
Aggregate.prototype.group()
Aggregate.prototype.hint()
Aggregate.prototype.limit()
Aggregate.prototype.lookup()
Aggregate.prototype.match()
Aggregate.prototype.model()
Aggregate.prototype.near()
Aggregate.prototype.option()
Aggregate.prototype.options
Aggregate.prototype.pipeline()
Aggregate.prototype.project()
Aggregate.prototype.read()
Aggregate.prototype.readConcern()
Aggregate.prototype.redact()
Aggregate.prototype.replaceRoot()
Aggregate.prototype.sample()
Aggregate.prototype.search()
Aggregate.prototype.session()
Aggregate.prototype.skip()
Aggregate.prototype.sort()
Aggregate.prototype.sortByCount()
Aggregate.prototype.then()
Aggregate.prototype.unionWith()
Aggregate.prototype.unwind()
Aggregate.prototype[Symbol.asyncIterator]()
Aggregate()
参数
[pipeline]
«Array» 聚合管道,以对象数组的形式[model]
«Model» 要与该聚合一起使用的模型。
参见
用于构建聚合管道的 Aggregate 构造函数。不要直接实例化此类,请使用 Model.aggregate() 代替。
示例
const aggregate = Model.aggregate([
{ $project: { a: 1, b: 1 } },
{ $skip: 5 }
]);
Model.
aggregate([{ $match: { age: { $gte: 21 }}}]).
unwind('tags').
exec();
注意
返回的文档是纯 JavaScript 对象,而不是 Mongoose 文档(因为可以返回任何形状的文档)。
Mongoose **不会** 转换管道阶段。以下**将不起作用**,除非数据库中的 _id 是字符串
new Aggregate([{ $match: { _id: '00000000000000000000000a' } }]); // 改为这样做以转换为 ObjectId new Aggregate([{ $match: { _id: new mongoose.Types.ObjectId('00000000000000000000000a') } }]);
Aggregate.prototype.addFields()
参数
arg
«Object» 字段规范
返回值
- «Aggregate»
参见
将新的 $addFields 运算符附加到此聚合管道。需要 MongoDB v3.4+ 才能工作
示例
// adding new fields based on existing fields
aggregate.addFields({
newField: '$b.nested'
, plusTen: { $add: ['$val', 10]}
, sub: {
name: '$a'
}
})
// etc
aggregate.addFields({ salary_k: { $divide: [ "$salary", 1000 ] } });
Aggregate.prototype.allowDiskUse()
参数
value
«Boolean» 应该告诉服务器它可以使用硬盘在聚合期间存储数据。
返回值
- «Aggregate» this
参见
Aggregate.prototype.append()
参数
...ops
«Object|Array[Object]» 要附加的运算符。可以是对象的扩展或单个对象数组参数。
返回值
- «Aggregate»
将新的运算符附加到此聚合管道
示例
aggregate.append({ $project: { field: 1 }}, { $limit: 2 });
// or pass an array
const pipeline = [{ $match: { daw: 'Logic Audio X' }} ];
aggregate.append(pipeline);
Aggregate.prototype.catch()
参数
[reject]
«Function»
返回值
- «Promise»
执行聚合并返回一个Promise
,该Promise
将解析为文档或拒绝错误。与 .then()
相似,但只接受拒绝处理程序。与await
兼容。
Aggregate.prototype.collation()
参数
collation
«Object» 选项
返回值
- «Aggregate» this
参见
Aggregate.prototype.count()
参数
fieldName
«String» 输出字段的名称,该字段的值为计数。它必须是非空字符串,不能以 $ 开头,也不能包含 . 字符。
返回值
- «Aggregate»
参见
Aggregate.prototype.cursor()
参数
options
«Object»[options.batchSize]
«Number» 设置游标批次大小[options.useMongooseAggCursor]
«Boolean» 使用实验性的 Mongoose 特定聚合游标(用于eachAsync()
和其他查询游标语义)
返回值
- «AggregationCursor» 代表此聚合的游标
参见
设置cursor
选项并执行此聚合,返回一个聚合游标。如果您想一次处理聚合的结果,因为聚合结果太大而无法放入内存,则游标很有用。
示例
const cursor = Model.aggregate(..).cursor({ batchSize: 1000 });
cursor.eachAsync(function(doc, i) {
// use doc
});
Aggregate.prototype.densify()
参数
arg
«Object» $densify 运算符内容
返回值
- «Aggregate»
参见
将新的 $densify 运算符附加到此聚合管道。
示例
aggregate.densify({
field: 'timestamp',
range: {
step: 1,
unit: 'hour',
bounds: [new Date('2021-05-18T00:00:00.000Z'), new Date('2021-05-18T08:00:00.000Z')]
}
});
Aggregate.prototype.exec()
返回值
- «Promise»
Aggregate.prototype.explain()
参数
[verbosity]
«String»
返回值
- «Promise»
Aggregate.prototype.facet()
参数
facet
«Object» 选项
返回值
- «Aggregate» this
参见
组合多个聚合管道。
示例
const res = await Model.aggregate().facet({
books: [{ groupBy: '$author' }],
price: [{ $bucketAuto: { groupBy: '$price', buckets: 2 } }]
});
// Output: { books: [...], price: [{...}, {...}] }
Aggregate.prototype.fill()
参数
arg
«Object» $fill 运算符内容
返回值
- «Aggregate»
参见
将新的 $fill 运算符附加到此聚合管道。
示例
aggregate.fill({
output: {
bootsSold: { value: 0 },
sandalsSold: { value: 0 },
sneakersSold: { value: 0 }
}
});
Aggregate.prototype.finally()
参数
[onFinally]
«Function»
返回值
- «Promise»
执行聚合并返回一个Promise
,该Promise
将解析为.finally()
链。
关于 JavaScript 中的 Promise finally()
的更多信息。
Aggregate.prototype.graphLookup()
参数
options
«Object» 到 $graphLookup,如上面链接中所述
返回值
- «Aggregate»
参见
将新的自定义 $graphLookup 运算符附加到此聚合管道,在集合上执行递归搜索。
请注意,graphLookup 最多只能使用 100 MB 内存,即使指定了{ allowDiskUse: true }
,也不允许使用磁盘。
示例
// Suppose we have a collection of courses, where a document might look like `{ _id: 0, name: 'Calculus', prerequisite: 'Trigonometry'}` and `{ _id: 0, name: 'Trigonometry', prerequisite: 'Algebra' }`
aggregate.graphLookup({ from: 'courses', startWith: '$prerequisite', connectFromField: 'prerequisite', connectToField: 'name', as: 'prerequisites', maxDepth: 3 }) // this will recursively search the 'courses' collection up to 3 prerequisites
Aggregate.prototype.group()
参数
arg
«Object» $group 运算符内容
返回值
- «Aggregate»
参见
Aggregate.prototype.hint()
参数
value
«Object|String» 提示对象或索引名称
返回值
- «Aggregate» this
参见
Aggregate.prototype.limit()
参数
num
«Number» 传递到下一阶段的最大记录数
返回值
- «Aggregate»
参见
Aggregate.prototype.lookup()
参数
options
«Object» 到 $lookup,如上面链接中所述
返回值
- «Aggregate»
参见
将新的自定义 $lookup 运算符附加到此聚合管道。
示例
aggregate.lookup({ from: 'users', localField: 'userId', foreignField: '_id', as: 'users' });
Aggregate.prototype.match()
参数
arg
«Object» $match 运算符内容
返回值
- «Aggregate»
参见
Aggregate.prototype.model()
参数
[model]
«Model» 设置与此聚合关联的模型。如果没有提供,则返回已存储的模型。
返回值
- «Model»
获取/设置此聚合将在其上执行的模型。
示例
const aggregate = MyModel.aggregate([{ $match: { answer: 42 } }]);
aggregate.model() === MyModel; // true
// Change the model. There's rarely any reason to do this.
aggregate.model(SomeOtherModel);
aggregate.model() === SomeOtherModel; // true
Aggregate.prototype.near()
参数
arg
«Object»
返回值
- «Aggregate»
参见
将新的 $geoNear 运算符附加到此聚合管道。
注意
**必须**用作管道中的第一个运算符。
示例
aggregate.near({
near: { type: 'Point', coordinates: [40.724, -73.997] },
distanceField: "dist.calculated", // required
maxDistance: 0.008,
query: { type: "public" },
includeLocs: "dist.location",
spherical: true,
});
Aggregate.prototype.option()
参数
options
«Object» 要合并到当前选项中的键[options.maxTimeMS]
«Number» 数字限制此聚合运行的时间,请参见 MongoDB 文档关于maxTimeMS
的内容[options.allowDiskUse]
«Boolean» 布尔值,如果为 true,则 MongoDB 服务器将在此聚合期间使用硬盘存储数据[options.collation]
«Object» 对象,请参见Aggregate.prototype.collation()
[options.session]
«ClientSession» ClientSession,请参见Aggregate.prototype.session()
返回值
- «Aggregate» this
参见
允许您设置任意选项,用于中间件或插件。
示例
const agg = Model.aggregate(..).option({ allowDiskUse: true }); // Set the `allowDiskUse` option
agg.options; // `{ allowDiskUse: true }`
Aggregate.prototype.options
类型
- «property»
包含传递到 聚合命令 的选项。支持的选项包括
allowDiskUse
bypassDocumentValidation
collation
comment
cursor
explain
fieldsAsRaw
hint
let
maxTimeMS
raw
readConcern
readPreference
session
writeConcern
Aggregate.prototype.pipeline()
返回值
- «Array» 与将要执行的操作类似的当前管道
Aggregate.prototype.project()
参数
arg
«Object|String» 字段规范
返回值
- «Aggregate»
参见
将新的 $project 运算符附加到此聚合管道。
Mongoose 查询 选择语法 也受支持。
示例
// include a, include b, exclude _id
aggregate.project("a b -_id");
// or you may use object notation, useful when
// you have keys already prefixed with a "-"
aggregate.project({a: 1, b: 1, _id: 0});
// reshaping documents
aggregate.project({
newField: '$b.nested'
, plusTen: { $add: ['$val', 10]}
, sub: {
name: '$a'
}
})
// etc
aggregate.project({ salary_k: { $divide: [ "$salary", 1000 ] } });
Aggregate.prototype.read()
参数
pref
«String|ReadPreference» 列出的首选项之一或其别名[tags]
«Array» 此查询的可选标签。
返回值
- «Aggregate» this
参见
Aggregate.prototype.readConcern()
参数
level
«String» 列出的读取关注级别之一或其别名
返回值
- «Aggregate» this
参见
Aggregate.prototype.redact()
参数
expression
«Object» redact 选项或条件表达式[thenExpr]
«String|Object» 条件为真的情况[elseExpr]
«String|Object» 条件为假的状况
返回值
- «Aggregate» this
参见
将新的 $redact 运算符附加到此聚合管道。
如果提供 3 个参数,Mongoose 将分别使用 $cond 运算符的 if-then-else 包装它们 如果thenExpr
或elseExpr
是字符串,请确保它以 $$ 开头,例如$$DESCEND
、$$PRUNE
或$$KEEP
。
示例
await Model.aggregate(pipeline).redact({
$cond: {
if: { $eq: [ '$level', 5 ] },
then: '$$PRUNE',
else: '$$DESCEND'
}
});
// $redact often comes with $cond operator, you can also use the following syntax provided by mongoose
await Model.aggregate(pipeline).redact({ $eq: [ '$level', 5 ] }, '$$PRUNE', '$$DESCEND');
Aggregate.prototype.replaceRoot()
参数
newRoot
«String|Object» 将成为新根文档的字段或文档
返回值
- «Aggregate»
参见
将新的 $replaceRoot 运算符附加到此聚合管道。
请注意,$replaceRoot
运算符要求字段字符串以 '$' 开头。如果您传入一个字符串,Mongoose 将在指定字段未以 '$' 开头的情况下添加 '$'。如果您传入一个对象,则表达式中的字符串将不会被修改。
示例
aggregate.replaceRoot("user");
aggregate.replaceRoot({ x: { $concat: ['$this', '$that'] } });
Aggregate.prototype.sample()
参数
size
«Number» 要选择的随机文档数量
返回值
- «Aggregate»
参见
Aggregate.prototype.search()
参数
$search
«Object» 选项
返回值
- «Aggregate» this
参见
用于 Atlas 文本搜索 的$search
阶段的助手。
示例
const res = await Model.aggregate().
search({
text: {
query: 'baseball',
path: 'plot'
}
});
// Output: [{ plot: '...', title: '...' }]
Aggregate.prototype.session()
参数
session
«ClientSession»
返回值
- «Aggregate» this
参见
为此聚合设置会话。对 事务 有用。
示例
const session = await Model.startSession();
await Model.aggregate(..).session(session);
Aggregate.prototype.skip()
参数
num
«Number» 在下一阶段之前要跳过的记录数
返回值
- «Aggregate»
参见
Aggregate.prototype.sort()
参数
arg
«Object|String»
返回值
- «Aggregate» this
参见
将新的 $sort 运算符附加到此聚合管道。
如果传入一个对象,允许的值为asc
、desc
、ascending
、descending
、1
和-1
。
如果传入一个字符串,它必须是空格分隔的路径名称列表。每个路径的排序顺序为升序,除非路径名称以-
为前缀,这将被视为降序。
示例
// these are equivalent
aggregate.sort({ field: 'asc', test: -1 });
aggregate.sort('field -test');
Aggregate.prototype.sortByCount()
参数
arg
«Object|String»
返回值
- «Aggregate» this
参见
将新的 $sortByCount 运算符附加到此聚合管道。接受字符串字段名称或管道对象。
请注意,$sortByCount
运算符要求新的根以 '$' 开头。如果指定字段名称未以 '$' 开头,Mongoose 将添加 '$'。
示例
aggregate.sortByCount('users');
aggregate.sortByCount({ $mergeObjects: [ "$employee", "$business" ] })
Aggregate.prototype.then()
参数
[resolve]
«Function» successCallback[reject]
«Function» errorCallback
返回值
- «Promise»
提供一个 Promise 类型的then
函数,该函数将在没有回调的情况下调用.exec
与await
兼容。
示例
Model.aggregate(..).then(successCallback, errorCallback);
Aggregate.prototype.unionWith()
参数
options
«对象» 到 $unionWith 查询,如上面链接所述
返回值
- «Aggregate»
参见
将新的 $unionWith 运算符附加到此聚合管道。
示例
aggregate.unionWith({ coll: 'users', pipeline: [ { $match: { _id: 1 } } ] });
Aggregate.prototype.unwind()
参数
fields
«字符串|对象|字符串数组|对象数组» 要展开的字段,可以是字段名称或 带有选项的对象。如果传递字符串,则可选地用 '$' 作为字段名称的前缀。如果传递对象,则path
必须以 '$' 开头。
返回值
- «Aggregate»
参见
将新的自定义 $unwind 运算符附加到此聚合管道。
请注意,$unwind
运算符要求路径名称以 '$' 开头。如果指定的字段不以 '$' 开头,Mongoose 会在前面加上 '$'。
示例
aggregate.unwind("tags");
aggregate.unwind("a", "b", "c");
aggregate.unwind({ path: '$tags', preserveNullAndEmptyArrays: true });
Aggregate.prototype[Symbol.asyncIterator]()
返回一个用于 for/await/of
循环 的异步迭代器。您无需显式调用此函数,JavaScript 运行时将为您调用它。
示例
const agg = Model.aggregate([{ $match: { age: { $gte: 25 } } }]);
for await (const doc of agg) {
console.log(doc.name);
}
Node.js 10.x 本机支持异步迭代器,无需任何标志。您可以使用 --harmony_async_iteration
标志 在 Node.js 8.x 中启用异步迭代器。
注意:如果 Symbol.asyncIterator
未定义,则不会设置此函数。如果 Symbol.asyncIterator
未定义,则意味着您的 Node.js 版本不支持异步迭代器。