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.
		
		
		
		
		
			
		
			
				
					80 lines
				
				2.4 KiB
			
		
		
			
		
	
	
					80 lines
				
				2.4 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | const applyRetryableWrites = require('../utils').applyRetryableWrites; | ||
|  | const applyWriteConcern = require('../utils').applyWriteConcern; | ||
|  | const MongoError = require('../core').MongoError; | ||
|  | const OperationBase = require('./operation').OperationBase; | ||
|  | 
 | ||
|  | class BulkWriteOperation extends OperationBase { | ||
|  |   constructor(collection, operations, options) { | ||
|  |     super(options); | ||
|  | 
 | ||
|  |     this.collection = collection; | ||
|  |     this.operations = operations; | ||
|  |   } | ||
|  | 
 | ||
|  |   execute(callback) { | ||
|  |     const coll = this.collection; | ||
|  |     const operations = this.operations; | ||
|  |     let options = this.options; | ||
|  | 
 | ||
|  |     // Add ignoreUndfined
 | ||
|  |     if (coll.s.options.ignoreUndefined) { | ||
|  |       options = Object.assign({}, options); | ||
|  |       options.ignoreUndefined = coll.s.options.ignoreUndefined; | ||
|  |     } | ||
|  | 
 | ||
|  |     // Create the bulk operation
 | ||
|  |     const bulk = | ||
|  |       options.ordered === true || options.ordered == null | ||
|  |         ? coll.initializeOrderedBulkOp(options) | ||
|  |         : coll.initializeUnorderedBulkOp(options); | ||
|  | 
 | ||
|  |     // Do we have a collation
 | ||
|  |     let collation = false; | ||
|  | 
 | ||
|  |     // for each op go through and add to the bulk
 | ||
|  |     try { | ||
|  |       for (let i = 0; i < operations.length; i++) { | ||
|  |         // Get the operation type
 | ||
|  |         const key = Object.keys(operations[i])[0]; | ||
|  |         // Check if we have a collation
 | ||
|  |         if (operations[i][key].collation) { | ||
|  |           collation = true; | ||
|  |         } | ||
|  | 
 | ||
|  |         // Pass to the raw bulk
 | ||
|  |         bulk.raw(operations[i]); | ||
|  |       } | ||
|  |     } catch (err) { | ||
|  |       return callback(err, null); | ||
|  |     } | ||
|  | 
 | ||
|  |     // Final options for retryable writes and write concern
 | ||
|  |     let finalOptions = Object.assign({}, options); | ||
|  |     finalOptions = applyRetryableWrites(finalOptions, coll.s.db); | ||
|  |     finalOptions = applyWriteConcern(finalOptions, { db: coll.s.db, collection: coll }, options); | ||
|  | 
 | ||
|  |     const writeCon = finalOptions.writeConcern ? finalOptions.writeConcern : {}; | ||
|  |     const capabilities = coll.s.topology.capabilities(); | ||
|  | 
 | ||
|  |     // Did the user pass in a collation, check if our write server supports it
 | ||
|  |     if (collation && capabilities && !capabilities.commandsTakeCollation) { | ||
|  |       return callback(new MongoError('server/primary/mongos does not support collation')); | ||
|  |     } | ||
|  | 
 | ||
|  |     // Execute the bulk
 | ||
|  |     bulk.execute(writeCon, finalOptions, (err, r) => { | ||
|  |       // We have connection level error
 | ||
|  |       if (!r && err) { | ||
|  |         return callback(err, null); | ||
|  |       } | ||
|  | 
 | ||
|  |       // Return the results
 | ||
|  |       callback(null, r); | ||
|  |     }); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = BulkWriteOperation; |