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.
		
		
		
		
		
			
		
			
				
					
					
						
							155 lines
						
					
					
						
							5.5 KiB
						
					
					
				
			
		
		
	
	
							155 lines
						
					
					
						
							5.5 KiB
						
					
					
				| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| exports.FindOperation = void 0;
 | |
| const error_1 = require("../error");
 | |
| const read_concern_1 = require("../read_concern");
 | |
| const sort_1 = require("../sort");
 | |
| const utils_1 = require("../utils");
 | |
| const command_1 = require("./command");
 | |
| const operation_1 = require("./operation");
 | |
| /** @internal */
 | |
| class FindOperation extends command_1.CommandOperation {
 | |
|     constructor(collection, ns, filter = {}, options = {}) {
 | |
|         super(collection, options);
 | |
|         this.options = options;
 | |
|         this.ns = ns;
 | |
|         if (typeof filter !== 'object' || Array.isArray(filter)) {
 | |
|             throw new error_1.MongoInvalidArgumentError('Query filter must be a plain object or ObjectId');
 | |
|         }
 | |
|         // If the filter is a buffer, validate that is a valid BSON document
 | |
|         if (Buffer.isBuffer(filter)) {
 | |
|             const objectSize = filter[0] | (filter[1] << 8) | (filter[2] << 16) | (filter[3] << 24);
 | |
|             if (objectSize !== filter.length) {
 | |
|                 throw new error_1.MongoInvalidArgumentError(`Query filter raw message size does not match message header size [${filter.length}] != [${objectSize}]`);
 | |
|             }
 | |
|         }
 | |
|         // special case passing in an ObjectId as a filter
 | |
|         this.filter = filter != null && filter._bsontype === 'ObjectID' ? { _id: filter } : filter;
 | |
|     }
 | |
|     execute(server, session, callback) {
 | |
|         this.server = server;
 | |
|         const options = this.options;
 | |
|         let findCommand = makeFindCommand(this.ns, this.filter, options);
 | |
|         if (this.explain) {
 | |
|             findCommand = (0, utils_1.decorateWithExplain)(findCommand, this.explain);
 | |
|         }
 | |
|         server.command(this.ns, findCommand, {
 | |
|             ...this.options,
 | |
|             ...this.bsonOptions,
 | |
|             documentsReturnedIn: 'firstBatch',
 | |
|             session
 | |
|         }, callback);
 | |
|     }
 | |
| }
 | |
| exports.FindOperation = FindOperation;
 | |
| function makeFindCommand(ns, filter, options) {
 | |
|     const findCommand = {
 | |
|         find: ns.collection,
 | |
|         filter
 | |
|     };
 | |
|     if (options.sort) {
 | |
|         findCommand.sort = (0, sort_1.formatSort)(options.sort);
 | |
|     }
 | |
|     if (options.projection) {
 | |
|         let projection = options.projection;
 | |
|         if (projection && Array.isArray(projection)) {
 | |
|             projection = projection.length
 | |
|                 ? projection.reduce((result, field) => {
 | |
|                     result[field] = 1;
 | |
|                     return result;
 | |
|                 }, {})
 | |
|                 : { _id: 1 };
 | |
|         }
 | |
|         findCommand.projection = projection;
 | |
|     }
 | |
|     if (options.hint) {
 | |
|         findCommand.hint = (0, utils_1.normalizeHintField)(options.hint);
 | |
|     }
 | |
|     if (typeof options.skip === 'number') {
 | |
|         findCommand.skip = options.skip;
 | |
|     }
 | |
|     if (typeof options.limit === 'number') {
 | |
|         if (options.limit < 0) {
 | |
|             findCommand.limit = -options.limit;
 | |
|             findCommand.singleBatch = true;
 | |
|         }
 | |
|         else {
 | |
|             findCommand.limit = options.limit;
 | |
|         }
 | |
|     }
 | |
|     if (typeof options.batchSize === 'number') {
 | |
|         if (options.batchSize < 0) {
 | |
|             if (options.limit &&
 | |
|                 options.limit !== 0 &&
 | |
|                 Math.abs(options.batchSize) < Math.abs(options.limit)) {
 | |
|                 findCommand.limit = -options.batchSize;
 | |
|             }
 | |
|             findCommand.singleBatch = true;
 | |
|         }
 | |
|         else {
 | |
|             findCommand.batchSize = options.batchSize;
 | |
|         }
 | |
|     }
 | |
|     if (typeof options.singleBatch === 'boolean') {
 | |
|         findCommand.singleBatch = options.singleBatch;
 | |
|     }
 | |
|     // we check for undefined specifically here to allow falsy values
 | |
|     // eslint-disable-next-line no-restricted-syntax
 | |
|     if (options.comment !== undefined) {
 | |
|         findCommand.comment = options.comment;
 | |
|     }
 | |
|     if (typeof options.maxTimeMS === 'number') {
 | |
|         findCommand.maxTimeMS = options.maxTimeMS;
 | |
|     }
 | |
|     const readConcern = read_concern_1.ReadConcern.fromOptions(options);
 | |
|     if (readConcern) {
 | |
|         findCommand.readConcern = readConcern.toJSON();
 | |
|     }
 | |
|     if (options.max) {
 | |
|         findCommand.max = options.max;
 | |
|     }
 | |
|     if (options.min) {
 | |
|         findCommand.min = options.min;
 | |
|     }
 | |
|     if (typeof options.returnKey === 'boolean') {
 | |
|         findCommand.returnKey = options.returnKey;
 | |
|     }
 | |
|     if (typeof options.showRecordId === 'boolean') {
 | |
|         findCommand.showRecordId = options.showRecordId;
 | |
|     }
 | |
|     if (typeof options.tailable === 'boolean') {
 | |
|         findCommand.tailable = options.tailable;
 | |
|     }
 | |
|     if (typeof options.oplogReplay === 'boolean') {
 | |
|         findCommand.oplogReplay = options.oplogReplay;
 | |
|     }
 | |
|     if (typeof options.timeout === 'boolean') {
 | |
|         findCommand.noCursorTimeout = !options.timeout;
 | |
|     }
 | |
|     else if (typeof options.noCursorTimeout === 'boolean') {
 | |
|         findCommand.noCursorTimeout = options.noCursorTimeout;
 | |
|     }
 | |
|     if (typeof options.awaitData === 'boolean') {
 | |
|         findCommand.awaitData = options.awaitData;
 | |
|     }
 | |
|     if (typeof options.allowPartialResults === 'boolean') {
 | |
|         findCommand.allowPartialResults = options.allowPartialResults;
 | |
|     }
 | |
|     if (options.collation) {
 | |
|         findCommand.collation = options.collation;
 | |
|     }
 | |
|     if (typeof options.allowDiskUse === 'boolean') {
 | |
|         findCommand.allowDiskUse = options.allowDiskUse;
 | |
|     }
 | |
|     if (options.let) {
 | |
|         findCommand.let = options.let;
 | |
|     }
 | |
|     return findCommand;
 | |
| }
 | |
| (0, operation_1.defineAspects)(FindOperation, [
 | |
|     operation_1.Aspect.READ_OPERATION,
 | |
|     operation_1.Aspect.RETRYABLE,
 | |
|     operation_1.Aspect.EXPLAINABLE,
 | |
|     operation_1.Aspect.CURSOR_CREATING
 | |
| ]);
 | |
| //# sourceMappingURL=find.js.map
 |