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.
69 lines
1.8 KiB
69 lines
1.8 KiB
4 years ago
|
'use strict';
|
||
|
|
||
|
const buildCountCommand = require('./common_functions').buildCountCommand;
|
||
|
const OperationBase = require('./operation').OperationBase;
|
||
|
|
||
|
class CountOperation extends OperationBase {
|
||
|
constructor(cursor, applySkipLimit, options) {
|
||
|
super(options);
|
||
|
|
||
|
this.cursor = cursor;
|
||
|
this.applySkipLimit = applySkipLimit;
|
||
|
}
|
||
|
|
||
|
execute(callback) {
|
||
|
const cursor = this.cursor;
|
||
|
const applySkipLimit = this.applySkipLimit;
|
||
|
const options = this.options;
|
||
|
|
||
|
if (applySkipLimit) {
|
||
|
if (typeof cursor.cursorSkip() === 'number') options.skip = cursor.cursorSkip();
|
||
|
if (typeof cursor.cursorLimit() === 'number') options.limit = cursor.cursorLimit();
|
||
|
}
|
||
|
|
||
|
// Ensure we have the right read preference inheritance
|
||
|
if (options.readPreference) {
|
||
|
cursor.setReadPreference(options.readPreference);
|
||
|
}
|
||
|
|
||
|
if (
|
||
|
typeof options.maxTimeMS !== 'number' &&
|
||
|
cursor.cmd &&
|
||
|
typeof cursor.cmd.maxTimeMS === 'number'
|
||
|
) {
|
||
|
options.maxTimeMS = cursor.cmd.maxTimeMS;
|
||
|
}
|
||
|
|
||
|
let finalOptions = {};
|
||
|
finalOptions.skip = options.skip;
|
||
|
finalOptions.limit = options.limit;
|
||
|
finalOptions.hint = options.hint;
|
||
|
finalOptions.maxTimeMS = options.maxTimeMS;
|
||
|
|
||
|
// Command
|
||
|
finalOptions.collectionName = cursor.namespace.collection;
|
||
|
|
||
|
let command;
|
||
|
try {
|
||
|
command = buildCountCommand(cursor, cursor.cmd.query, finalOptions);
|
||
|
} catch (err) {
|
||
|
return callback(err);
|
||
|
}
|
||
|
|
||
|
// Set cursor server to the same as the topology
|
||
|
cursor.server = cursor.topology.s.coreTopology;
|
||
|
|
||
|
// Execute the command
|
||
|
cursor.topology.command(
|
||
|
cursor.namespace.withCollection('$cmd'),
|
||
|
command,
|
||
|
cursor.options,
|
||
|
(err, result) => {
|
||
|
callback(err, result ? result.result.n : null);
|
||
|
}
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = CountOperation;
|