4 * @fileOverview The **ReadPreference** class is a class that represents a MongoDB ReadPreference and is
5 * used to construct connections.
8 * var Db = require('mongodb').Db,
9 * ReplSet = require('mongodb').ReplSet,
10 * Server = require('mongodb').Server,
11 * ReadPreference = require('mongodb').ReadPreference,
12 * test = require('assert');
13 * // Connect using ReplSet
14 * var server = new Server('localhost', 27017);
15 * var db = new Db('test', new ReplSet([server]));
16 * db.open(function(err, db) {
17 * test.equal(null, err);
19 * var cursor = db.collection('t').find({});
20 * cursor.setReadPreference(ReadPreference.PRIMARY);
21 * cursor.toArray(function(err, docs) {
22 * test.equal(null, err);
29 * Creates a new ReadPreference instance
32 * - **ReadPreference.PRIMARY**, Read from primary only. All operations produce an error (throw an exception where applicable) if primary is unavailable. Cannot be combined with tags (This is the default.).
33 * - **ReadPreference.PRIMARY_PREFERRED**, Read from primary if available, otherwise a secondary.
34 * - **ReadPreference.SECONDARY**, Read from secondary if available, otherwise error.
35 * - **ReadPreference.SECONDARY_PREFERRED**, Read from a secondary if available, otherwise read from the primary.
36 * - **ReadPreference.NEAREST**, All modes read from among the nearest candidates, but unlike other modes, NEAREST will include both the primary and all secondaries in the random selection.
39 * @param {string} mode The ReadPreference mode as listed above.
40 * @param {array|object} tags An object representing read preference tags.
41 * @param {object} [options] Additional read preference options
42 * @param {number} [options.maxStalenessMS] Max Secondary Read Stalleness in Miliseconds
43 * @return {ReadPreference} a ReadPreference instance.
45 var ReadPreference = function(mode, tags, options) {
46 if(!(this instanceof ReadPreference)) {
47 return new ReadPreference(mode, tags, options);
50 this._type = 'ReadPreference';
53 this.options = options;
55 // If no tags were passed in
56 if(tags && typeof tags == 'object' && !Array.isArray(tags)) {
57 if(tags.maxStalenessMS) {
63 // Add the maxStalenessMS value to the read Preference
64 if(this.options && this.options.maxStalenessMS) {
65 this.maxStalenessMS = this.options.maxStalenessMS;
70 * Validate if a mode is legal
73 * @param {string} mode The string representing the read preference mode.
76 ReadPreference.isValid = function(_mode) {
77 return (_mode == ReadPreference.PRIMARY || _mode == ReadPreference.PRIMARY_PREFERRED
78 || _mode == ReadPreference.SECONDARY || _mode == ReadPreference.SECONDARY_PREFERRED
79 || _mode == ReadPreference.NEAREST
80 || _mode == true || _mode == false || _mode == null);
84 * Validate if a mode is legal
87 * @param {string} mode The string representing the read preference mode.
90 ReadPreference.prototype.isValid = function(mode) {
91 var _mode = typeof mode == 'string' ? mode : this.mode;
92 return ReadPreference.isValid(_mode);
98 ReadPreference.prototype.toObject = function() {
99 var object = {mode:this.mode};
101 if(this.tags != null) {
102 object['tags'] = this.tags;
105 if(this.maxStalenessMS) {
106 object['maxStalenessMS'] = this.maxStalenessMS;
115 ReadPreference.prototype.toJSON = function() {
116 return this.toObject();
122 ReadPreference.PRIMARY = 'primary';
123 ReadPreference.PRIMARY_PREFERRED = 'primaryPreferred';
124 ReadPreference.SECONDARY = 'secondary';
125 ReadPreference.SECONDARY_PREFERRED = 'secondaryPreferred';
126 ReadPreference.NEAREST = 'nearest'
131 module.exports = ReadPreference;