You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							168 lines
						
					
					
						
							6.3 KiB
						
					
					
				
			
		
		
	
	
							168 lines
						
					
					
						
							6.3 KiB
						
					
					
				"use strict";
 | 
						|
Object.defineProperty(exports, "__esModule", { value: true });
 | 
						|
exports.AggregationCursor = void 0;
 | 
						|
const aggregate_1 = require("../operations/aggregate");
 | 
						|
const execute_operation_1 = require("../operations/execute_operation");
 | 
						|
const utils_1 = require("../utils");
 | 
						|
const abstract_cursor_1 = require("./abstract_cursor");
 | 
						|
/** @internal */
 | 
						|
const kPipeline = Symbol('pipeline');
 | 
						|
/** @internal */
 | 
						|
const kOptions = Symbol('options');
 | 
						|
/**
 | 
						|
 * The **AggregationCursor** class is an internal class that embodies an aggregation cursor on MongoDB
 | 
						|
 * allowing for iteration over the results returned from the underlying query. It supports
 | 
						|
 * one by one document iteration, conversion to an array or can be iterated as a Node 4.X
 | 
						|
 * or higher stream
 | 
						|
 * @public
 | 
						|
 */
 | 
						|
class AggregationCursor extends abstract_cursor_1.AbstractCursor {
 | 
						|
    /** @internal */
 | 
						|
    constructor(client, namespace, pipeline = [], options = {}) {
 | 
						|
        super(client, namespace, options);
 | 
						|
        this[kPipeline] = pipeline;
 | 
						|
        this[kOptions] = options;
 | 
						|
    }
 | 
						|
    get pipeline() {
 | 
						|
        return this[kPipeline];
 | 
						|
    }
 | 
						|
    clone() {
 | 
						|
        const clonedOptions = (0, utils_1.mergeOptions)({}, this[kOptions]);
 | 
						|
        delete clonedOptions.session;
 | 
						|
        return new AggregationCursor(this.client, this.namespace, this[kPipeline], {
 | 
						|
            ...clonedOptions
 | 
						|
        });
 | 
						|
    }
 | 
						|
    map(transform) {
 | 
						|
        return super.map(transform);
 | 
						|
    }
 | 
						|
    /** @internal */
 | 
						|
    _initialize(session, callback) {
 | 
						|
        const aggregateOperation = new aggregate_1.AggregateOperation(this.namespace, this[kPipeline], {
 | 
						|
            ...this[kOptions],
 | 
						|
            ...this.cursorOptions,
 | 
						|
            session
 | 
						|
        });
 | 
						|
        (0, execute_operation_1.executeOperation)(this.client, aggregateOperation, (err, response) => {
 | 
						|
            if (err || response == null)
 | 
						|
                return callback(err);
 | 
						|
            // TODO: NODE-2882
 | 
						|
            callback(undefined, { server: aggregateOperation.server, session, response });
 | 
						|
        });
 | 
						|
    }
 | 
						|
    /** Execute the explain for the cursor */
 | 
						|
    async explain(verbosity) {
 | 
						|
        return (0, execute_operation_1.executeOperation)(this.client, new aggregate_1.AggregateOperation(this.namespace, this[kPipeline], {
 | 
						|
            ...this[kOptions],
 | 
						|
            ...this.cursorOptions,
 | 
						|
            explain: verbosity ?? true
 | 
						|
        }));
 | 
						|
    }
 | 
						|
    group($group) {
 | 
						|
        (0, abstract_cursor_1.assertUninitialized)(this);
 | 
						|
        this[kPipeline].push({ $group });
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    /** Add a limit stage to the aggregation pipeline */
 | 
						|
    limit($limit) {
 | 
						|
        (0, abstract_cursor_1.assertUninitialized)(this);
 | 
						|
        this[kPipeline].push({ $limit });
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    /** Add a match stage to the aggregation pipeline */
 | 
						|
    match($match) {
 | 
						|
        (0, abstract_cursor_1.assertUninitialized)(this);
 | 
						|
        this[kPipeline].push({ $match });
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    /** Add an out stage to the aggregation pipeline */
 | 
						|
    out($out) {
 | 
						|
        (0, abstract_cursor_1.assertUninitialized)(this);
 | 
						|
        this[kPipeline].push({ $out });
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    /**
 | 
						|
     * Add a project stage to the aggregation pipeline
 | 
						|
     *
 | 
						|
     * @remarks
 | 
						|
     * In order to strictly type this function you must provide an interface
 | 
						|
     * that represents the effect of your projection on the result documents.
 | 
						|
     *
 | 
						|
     * By default chaining a projection to your cursor changes the returned type to the generic {@link Document} type.
 | 
						|
     * You should specify a parameterized type to have assertions on your final results.
 | 
						|
     *
 | 
						|
     * @example
 | 
						|
     * ```typescript
 | 
						|
     * // Best way
 | 
						|
     * const docs: AggregationCursor<{ a: number }> = cursor.project<{ a: number }>({ _id: 0, a: true });
 | 
						|
     * // Flexible way
 | 
						|
     * const docs: AggregationCursor<Document> = cursor.project({ _id: 0, a: true });
 | 
						|
     * ```
 | 
						|
     *
 | 
						|
     * @remarks
 | 
						|
     * In order to strictly type this function you must provide an interface
 | 
						|
     * that represents the effect of your projection on the result documents.
 | 
						|
     *
 | 
						|
     * **Note for Typescript Users:** adding a transform changes the return type of the iteration of this cursor,
 | 
						|
     * it **does not** return a new instance of a cursor. This means when calling project,
 | 
						|
     * you should always assign the result to a new variable in order to get a correctly typed cursor variable.
 | 
						|
     * Take note of the following example:
 | 
						|
     *
 | 
						|
     * @example
 | 
						|
     * ```typescript
 | 
						|
     * const cursor: AggregationCursor<{ a: number; b: string }> = coll.aggregate([]);
 | 
						|
     * const projectCursor = cursor.project<{ a: number }>({ _id: 0, a: true });
 | 
						|
     * const aPropOnlyArray: {a: number}[] = await projectCursor.toArray();
 | 
						|
     *
 | 
						|
     * // or always use chaining and save the final cursor
 | 
						|
     *
 | 
						|
     * const cursor = coll.aggregate().project<{ a: string }>({
 | 
						|
     *   _id: 0,
 | 
						|
     *   a: { $convert: { input: '$a', to: 'string' }
 | 
						|
     * }});
 | 
						|
     * ```
 | 
						|
     */
 | 
						|
    project($project) {
 | 
						|
        (0, abstract_cursor_1.assertUninitialized)(this);
 | 
						|
        this[kPipeline].push({ $project });
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    /** Add a lookup stage to the aggregation pipeline */
 | 
						|
    lookup($lookup) {
 | 
						|
        (0, abstract_cursor_1.assertUninitialized)(this);
 | 
						|
        this[kPipeline].push({ $lookup });
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    /** Add a redact stage to the aggregation pipeline */
 | 
						|
    redact($redact) {
 | 
						|
        (0, abstract_cursor_1.assertUninitialized)(this);
 | 
						|
        this[kPipeline].push({ $redact });
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    /** Add a skip stage to the aggregation pipeline */
 | 
						|
    skip($skip) {
 | 
						|
        (0, abstract_cursor_1.assertUninitialized)(this);
 | 
						|
        this[kPipeline].push({ $skip });
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    /** Add a sort stage to the aggregation pipeline */
 | 
						|
    sort($sort) {
 | 
						|
        (0, abstract_cursor_1.assertUninitialized)(this);
 | 
						|
        this[kPipeline].push({ $sort });
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    /** Add a unwind stage to the aggregation pipeline */
 | 
						|
    unwind($unwind) {
 | 
						|
        (0, abstract_cursor_1.assertUninitialized)(this);
 | 
						|
        this[kPipeline].push({ $unwind });
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    /** Add a geoNear stage to the aggregation pipeline */
 | 
						|
    geoNear($geoNear) {
 | 
						|
        (0, abstract_cursor_1.assertUninitialized)(this);
 | 
						|
        this[kPipeline].push({ $geoNear });
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
}
 | 
						|
exports.AggregationCursor = AggregationCursor;
 | 
						|
//# sourceMappingURL=aggregation_cursor.js.map
 |