Skip to content

Commit 3d199cd

Browse files
committed
NODE-477 Ensure insertOne/insertMany/updateOne/updateMay/replaceOne/deleteOne/deleteMany return {ok:1} on 2.4 or earlier servers that do not support write commands
1 parent de79c13 commit 3d199cd

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

lib/collection.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,9 @@ Collection.prototype.insertOne = function(doc, options, callback) {
345345
insertDocuments(this, [doc], options, function(err, r) {
346346
if(callback == null) return;
347347
if(err && callback) return callback(err);
348+
// Workaround for pre 2.6 servers
349+
if(r == null) return callback(null, {result: {ok:1}});
350+
// Add values to top level to ensure crud spec compatibility
348351
r.insertedCount = r.result.n;
349352
r.insertedId = doc._id;
350353
if(callback) callback(null, r);
@@ -370,6 +373,7 @@ Collection.prototype.insertMany = function(docs, options, callback) {
370373
insertDocuments(this, docs, options, function(err, r) {
371374
if(callback == null) return;
372375
if(err && callback) return callback(err);
376+
if(r == null) return callback(null, {result: {ok:1}});
373377
r.insertedCount = r.result.n;
374378
var ids = [];
375379
for(var i = 0; i < docs.length; i++) {
@@ -557,6 +561,7 @@ Collection.prototype.updateOne = function(filter, update, options, callback) {
557561
updateDocuments(this, filter, update, options, function(err, r) {
558562
if(callback == null) return;
559563
if(err && callback) return callback(err);
564+
if(r == null) return callback(null, {result: {ok:1}});
560565
r.matchedCount = r.result.n;
561566
r.modifiedCount = r.result.nModified != null ? r.result.nModified : r.result.n;
562567
r.upsertedId = Array.isArray(r.result.upserted) && r.result.upserted.length > 0 ? r.result.upserted[0] : null;
@@ -587,6 +592,7 @@ Collection.prototype.replaceOne = function(filter, update, options, callback) {
587592
updateDocuments(this, filter, update, options, function(err, r) {
588593
if(callback == null) return;
589594
if(err && callback) return callback(err);
595+
if(r == null) return callback(null, {result: {ok:1}});
590596
r.matchedCount = r.result.n;
591597
r.modifiedCount = r.result.nModified != null ? r.result.nModified : r.result.n;
592598
r.upsertedId = Array.isArray(r.result.upserted) && r.result.upserted.length > 0 ? r.result.upserted[0] : null;
@@ -618,6 +624,7 @@ Collection.prototype.updateMany = function(filter, update, options, callback) {
618624
updateDocuments(this, filter, update, options, function(err, r) {
619625
if(callback == null) return;
620626
if(err && callback) return callback(err);
627+
if(r == null) return callback(null, {result: {ok:1}});
621628
r.matchedCount = r.result.n;
622629
r.modifiedCount = r.result.nModified != null ? r.result.nModified : r.result.n;
623630
r.upsertedId = Array.isArray(r.result.upserted) && r.result.upserted.length > 0 ? r.result.upserted[0] : null;
@@ -698,6 +705,7 @@ Collection.prototype.deleteOne = function(filter, options, callback) {
698705
removeDocuments(this, filter, options, function(err, r) {
699706
if(callback == null) return;
700707
if(err && callback) return callback(err);
708+
if(r == null) return callback(null, {result: {ok:1}});
701709
r.deletedCount = r.result.n;
702710
if(callback) callback(null, r);
703711
});
@@ -723,6 +731,7 @@ Collection.prototype.deleteMany = function(filter, options, callback) {
723731
removeDocuments(this, filter, options, function(err, r) {
724732
if(callback == null) return;
725733
if(err && callback) return callback(err);
734+
if(r == null) return callback(null, {result: {ok:1}});
726735
r.deletedCount = r.result.n;
727736
if(callback) callback(null, r);
728737
});

test/functional/crud_api_tests.js

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,7 @@ exports['should correctly execute removeMany with no selector'] = {
800800
}
801801
}
802802

803-
exports['should correctly execute insertOne with w:0'] = {
803+
exports['should correctly execute crud operations with w:0'] = {
804804
// Add a tag that our runner can trigger on
805805
// in this case we are setting that node needs to be higher than 0.10.X to run
806806
metadata: { requires: { topology: ['single', 'replicaset', 'sharded', 'ssl', 'heap', 'wiredtiger'] } },
@@ -818,8 +818,33 @@ exports['should correctly execute insertOne with w:0'] = {
818818
test.equal(null, err);
819819
test.equal(1, result.result.ok);
820820

821-
db.close();
822-
test.done();
821+
col.insertMany([{a:1}], {w:0}, function(err,result) {
822+
test.equal(null, err);
823+
test.equal(1, result.result.ok);
824+
825+
col.updateOne({a:1}, {$set: {b:1}}, {w:0}, function(err,result) {
826+
test.equal(null, err);
827+
test.equal(1, result.result.ok);
828+
829+
col.updateMany({a:1}, {$set: {b:1}}, {w:0}, function(err,result) {
830+
test.equal(null, err);
831+
test.equal(1, result.result.ok);
832+
833+
col.deleteOne({a:1}, {w:0}, function(err,result) {
834+
test.equal(null, err);
835+
test.equal(1, result.result.ok);
836+
837+
col.deleteMany({a:1}, {w:0}, function(err,result) {
838+
test.equal(null, err);
839+
test.equal(1, result.result.ok);
840+
841+
db.close();
842+
test.done();
843+
});
844+
});
845+
});
846+
});
847+
});
823848
});
824849
});
825850
}

0 commit comments

Comments
 (0)