Агрегирование
Aggregate()
Параметры:
-
[pipeline]«Массив» конвейер агрегирования в виде массива объектов -
[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«Объект» спецификация поля
Возвращает:
- «Агрегирование»
См.:
Добавляет новый оператор $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«Логическое» Указать серверу, что он может использовать жесткий диск для хранения данных во время агрегирования.
Возвращает:
- «Агрегирование» this
См.:
Устанавливает опцию allowDiskUse для запроса агрегирования
Пример:
await Model.aggregate([{ $match: { foo: 'bar' } }]).allowDiskUse(true);
Aggregate.prototype.append()
Параметры:
-
...ops«Объект|Массив[Объект]» оператор(ы) для добавления. Может быть либо разброс объектов, либо один параметр массива объектов.
Возвращает:
- «Агрегирование»
Добавляет новые операторы в конвейер агрегирования
Пример:
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]«Функция»
Возвращает:
- «Promise»
Выполняет агрегирование, возвращая Promise, которое будет разрешено с помощью документа(ов) или отклонено с ошибкой. Как и .then(), но принимает только обработчик отклонений. Совместимо с await.
Aggregate.prototype.collation()
Параметры:
-
collation«Объект» опции
Возвращает:
- «Агрегирование» this
См.:
Добавляет сортировку.
Пример:
const res = await Model.aggregate(pipeline).collation({ locale: 'en_US', strength: 1 });
Aggregate.prototype.count()
Параметры:
-
fieldName«Строка» Имя выходного поля, содержащего значение подсчета. Оно должно быть непустой строкой, не начинаться с $ и не содержать символ .
Возвращает:
- «Агрегирование»
См.:
Aggregate.prototype.cursor()
Параметры:
-
options«Объект» -
[options.batchSize]«Число» установить размер пакета курсора -
[options.useMongooseAggCursor]«Логическое» использовать экспериментальный Mongoose-специфичный агрегирующий курсор (дляeachAsync()и других семантик курсора запросов)
Возвращает:
- «AggregationCursor» курсор, представляющий это агрегирование
См.:
Устанавливает cursor и выполняет это агрегирование, возвращая агрегирующий курсор. Курсоры полезны, если вы хотите обрабатывать результаты агрегирования по одному, так как результат агрегирования слишком велик для размещения в памяти.
Пример:
const cursor = Model.aggregate(..).cursor({ batchSize: 1000 });
cursor.eachAsync(function(doc, i) {
// use doc
});
Aggregate.prototype.densify()
Параметры:
-
arg«Объект» содержимое оператора $densify
Возвращает:
- «Агрегирование»
См.:
Добавляет новый оператор $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]«Строка»
Возвращает:
- «Promise»
Aggregate.prototype.facet()
Параметры:
-
facet«Объект» опции
Возвращает:
- «Агрегирование» this
См.:
Объединяет несколько конвейеров агрегирования.
Пример:
const res = await Model.aggregate().facet({
books: [{ groupBy: '$author' }],
price: [{ $bucketAuto: { groupBy: '$price', buckets: 2 } }]
});
// Output: { books: [...], price: [{...}, {...}] }
Aggregate.prototype.fill()
Параметры:
-
arg«Объект» содержимое оператора $fill
Возвращает:
- «Агрегирование»
См.:
Добавляет новый оператор $fill в конвейер агрегирования.
Пример:
aggregate.fill({
output: {
bootsSold: { value: 0 },
sandalsSold: { value: 0 },
sneakersSold: { value: 0 }
}
});
Aggregate.prototype.finally()
Параметры:
-
[onFinally]«Функция»
Возвращает:
- «Promise»
Выполняет агрегирование, возвращая Promise, которое будет разрешено с .finally() сцеплённым.
Подробнее о Promise finally() в JavaScript.
Aggregate.prototype.graphLookup()
Параметры:
-
options«Объект» для $graphLookup, как описано в ссылке выше
Возвращает:
- «Агрегирование»
См.:
Добавляет новые пользовательские операторы $graphLookup в конвейер агрегирования, выполняя рекурсивный поиск в коллекции.
Обратите внимание, что graphLookup может потреблять не более 100 МБ памяти и не позволяет использовать диск, даже если { 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«Объект» содержимое оператора $group
Возвращает:
- «Агрегирование»
См.:
Добавляет новый пользовательский оператор $group в конвейер агрегирования.
Пример:
aggregate.group({ _id: "$department" });
Aggregate.prototype.hint()
Параметры:
-
value«Объект|Строка» объект с подсказкой или имя индекса
Возвращает:
- «Агрегирование» this
См.:
Устанавливает параметр подсказки для запроса агрегации
Пример:
Model.aggregate(..).hint({ qty: 1, category: 1 }).exec();
Aggregate.prototype.limit()
Параметры:
-
num«Число» максимальное количество записей для передачи на следующую стадию
Возвращает:
- «Агрегирование»
См.:
Aggregate.prototype.lookup()
Параметры:
-
options«Объект» для $lookup, как описано в ссылке выше
Возвращает:
- «Агрегирование»
См.:
Добавляет новый пользовательский оператор $lookup в этот агрегированный конвейер.
Пример:
aggregate.lookup({ from: 'users', localField: 'userId', foreignField: '_id', as: 'users' });
Aggregate.prototype.match()
Параметры:
-
arg«Объект» содержимое оператора $match
Возвращает:
- «Агрегирование»
См.:
Добавляет новый пользовательский оператор $match в этот агрегированный конвейер.
Пример:
aggregate.match({ department: { $in: [ "sales", "engineering" ] } });
Aggregate.prototype.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«Объект»
Возвращает:
- «Агрегирование»
См.:
Добавляет новый оператор $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«Объект» ключи для слияния с текущими параметрами -
[options.maxTimeMS]«Число» число, ограничивает время выполнения этой агрегации, см. документацию MongoDB поmaxTimeMS -
[options.allowDiskUse]«Булево» если true, сервер MongoDB будет использовать жесткий диск для хранения данных во время этой агрегации -
[options.collation]«Объект» объект, см.Aggregate.prototype.collation() -
[options.session]«ClientSession» ClientSession, см.Aggregate.prototype.session()
Возвращает:
- «Агрегирование» this
См.:
Позволяет устанавливать произвольные параметры для middleware или плагинов.
Пример:
const agg = Model.aggregate(..).option({ allowDiskUse: true }); // Set the `allowDiskUse` option
agg.options; // `{ allowDiskUse: true }`
Aggregate.prototype.options
Тип:
- «свойство»
Содержит параметры, переданные команде aggregate. Поддерживаемые параметры:
allowDiskUsebypassDocumentValidationcollationcommentcursorexplainfieldsAsRawhintletmaxTimeMSrawreadConcernreadPreferencesessionwriteConcern
Aggregate.prototype.pipeline()
Возвращает:
- «Массив» Текущий конвейер, похожий на операцию, которая будет выполнена
Возвращает текущий конвейер
Пример:
MyModel.aggregate().match({ test: 1 }).pipeline(); // [{ $match: { test: 1 } }]
Aggregate.prototype.project()
Параметры:
-
arg«Объект|Строка» спецификация поля
Возвращает:
- «Агрегирование»
См.:
Добавляет новый оператор $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«Строка|ReadPreference» один из перечисленных вариантов предпочтений или их псевдонимы -
[tags]«Массив» необязательные теги для этого запроса. УСТАРЕЛО
Возвращает:
- «Агрегирование» this
См.:
Устанавливает параметр readPreference для запроса агрегации.
Пример:
await Model.aggregate(pipeline).read('primaryPreferred');
Aggregate.prototype.readConcern()
Параметры:
-
level«Строка» один из перечисленных уровней readConcern или их псевдонимы
Возвращает:
- «Агрегирование» this
См.:
Устанавливает уровень readConcern для запроса агрегации.
Пример:
await Model.aggregate(pipeline).readConcern('majority');
Aggregate.prototype.redact()
Параметры:
-
expression«Объект» параметры redact или условное выражение -
[thenExpr]«Строка|Объект» истинное значение для условия -
[elseExpr]«Строка|Объект» ложное значение для условия
Возвращает:
- «Агрегирование» 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«Строка|Объект» поле или документ, который станет новым корневым документом
Возвращает:
- «Агрегирование»
См.:
Добавляет новый оператор $replaceRoot в этот агрегированный конвейер.
Обратите внимание, что оператор $replaceRoot требует, чтобы строковые поля начинались с '$'. Если вы передаёте строку, Mongoose добавит '$' в начало, если указанное поле не начинается с '$'. Если вы передаёте объект, строки в вашем выражении не будут изменены.
Пример:
aggregate.replaceRoot("user");
aggregate.replaceRoot({ x: { $concat: ['$this', '$that'] } });
Aggregate.prototype.sample()
Параметры:
-
size«Число» количество случайных документов для выбора
Возвращает:
- «Агрегирование»
См.:
Добавляет новый пользовательский оператор $sample в этот агрегированный конвейер.
Пример:
aggregate.sample(3); // Add a pipeline that picks 3 random documents
Aggregate.prototype.search()
Параметры:
-
$search«Объект» параметры
Возвращает:
- «Агрегирование» this
См.:
Справочный инструмент для стадии $search в поиске текста Atlas.
Пример:
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«Число» количество записей для пропуска перед следующей стадией
Возвращает:
- «Aggregate»
См.:
Aggregate.prototype.sort()
Параметры:
-
arg«Объект|Строка»
Возвращает:
- «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«Объект|Строка»
Возвращает:
- «Aggregate» this
См.:
Добавляет новый оператор $sortByCount в этот агрегируемый конвейер. Принимает либо имя поля в виде строки, либо объект конвейера.
Обратите внимание, что оператор $sortByCount требует, чтобы новое корневое значение начиналось с '$'. Mongoose добавит '$', если указанное имя поля не начинается с '$'.
Пример:
aggregate.sortByCount('users');
aggregate.sortByCount({ $mergeObjects: [ "$employee", "$business" ] })
Aggregate.prototype.then()
Параметры:
-
[resolve]«Функция» successCallback -
[reject]«Функция» 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]()
Возвращает 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 поддерживает async iterators напрямую без флагов. Вы можете включить async iterators в Node.js 8.x с помощью --harmony_async_iteration флага.
Примечание: Эта функция не устанавливается, если Symbol.asyncIterator не определено. Если Symbol.asyncIterator не определено, это означает, что ваша версия Node.js не поддерживает async iterators.
© 2010 LearnBoost
Licensed under the MIT License.
https://mongoosejs.com/docs/api/aggregate.html