聚合


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
参见

为聚合查询设置 allowDiskUse 选项

示例

await Model.aggregate([{ $match: { foo: 'bar' } }]).allowDiskUse(true);

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
参见

添加排序规则

示例

const res = await Model.aggregate(pipeline).collation({ locale: 'en_US', strength: 1 });

Aggregate.prototype.count()

参数
  • fieldName «String» 输出字段的名称,该字段的值为计数。它必须是非空字符串,不能以 $ 开头,也不能包含 . 字符。

返回值
  • «Aggregate»
参见

将新的 $count 运算符附加到此聚合管道。

示例

aggregate.count("userCount");

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»

在当前绑定的模型上执行聚合管道。

示例

const result = await aggregate.exec();

Aggregate.prototype.explain()

参数
  • [verbosity] «String»
返回值
  • «Promise»

使用 explain 执行聚合

示例

Model.aggregate(..).explain()

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»
参见

将新的自定义 $group 运算符附加到此聚合管道。

示例

aggregate.group({ _id: "$department" });

Aggregate.prototype.hint()

参数
  • value «Object|String» 提示对象或索引名称

返回值
  • «Aggregate» this
参见

为聚合查询设置提示选项

示例

Model.aggregate(..).hint({ qty: 1, category: 1 }).exec();

Aggregate.prototype.limit()

参数
  • num «Number» 传递到下一阶段的最大记录数

返回值
  • «Aggregate»
参见

将新的 $limit 运算符附加到此聚合管道。

示例

aggregate.limit(10);

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»
参见

将新的自定义 $match 运算符附加到此聚合管道。

示例

aggregate.match({ department: { $in: [ "sales", "engineering" ] } });

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()

参数
返回值
  • «Aggregate» this
参见

允许您设置任意选项,用于中间件或插件。

示例

const agg = Model.aggregate(..).option({ allowDiskUse: true }); // Set the `allowDiskUse` option
agg.options; // `{ allowDiskUse: true }`

Aggregate.prototype.options

类型
  • «property»

包含传递到 聚合命令 的选项。支持的选项包括


Aggregate.prototype.pipeline()

返回值
  • «Array» 与将要执行的操作类似的当前管道

返回当前管道

示例

MyModel.aggregate().match({ test: 1 }).pipeline(); // [{ $match: { test: 1 } }]

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
参见

为聚合查询设置 readPreference 选项。

示例

await Model.aggregate(pipeline).read('primaryPreferred');

Aggregate.prototype.readConcern()

参数
  • level «String» 列出的读取关注级别之一或其别名

返回值
  • «Aggregate» this
参见

为聚合查询设置 readConcern 级别。

示例

await Model.aggregate(pipeline).readConcern('majority');

Aggregate.prototype.redact()

参数
  • expression «Object» redact 选项或条件表达式

  • [thenExpr] «String|Object» 条件为真的情况

  • [elseExpr] «String|Object» 条件为假的状况

返回值
  • «Aggregate» this
参见

将新的 $redact 运算符附加到此聚合管道。

如果提供 3 个参数,Mongoose 将分别使用 $cond 运算符的 if-then-else 包装它们 如果thenExprelseExpr 是字符串,请确保它以 $$ 开头,例如$$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»
参见

将新的自定义 $sample 运算符附加到此聚合管道。

示例

aggregate.sample(3); // Add a pipeline that picks 3 random documents

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»
参见

将新的 $skip 运算符附加到此聚合管道。

示例

aggregate.skip(10);

Aggregate.prototype.sort()

参数
  • arg «Object|String»
返回值
  • «Aggregate» this
参见

将新的 $sort 运算符附加到此聚合管道。

如果传入一个对象,允许的值为ascdescascendingdescending1-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 函数,该函数将在没有回调的情况下调用.execawait 兼容。

示例

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 版本不支持异步迭代器。