@@ -73,6 +73,7 @@ using std::vector;
7373AtomicInt64 DBClientBase::ConnectionIdSequence;
7474
7575const char * const saslCommandUserSourceFieldName = " userSource" ;
76+ const char kBypassDocumentValidationKey [] = " bypassDocumentValidation" ;
7677
7778const int defaultMaxBsonObjectSize = 16 * 1024 * 1024 ;
7879const int defaultMaxMessageSizeBytes = defaultMaxBsonObjectSize * 2 ;
@@ -1344,6 +1345,7 @@ void DBClientBase::_findAndModify(const StringData& ns,
13441345 bool upsert,
13451346 const BSONObj& fields,
13461347 const WriteConcern* writeConcern,
1348+ bool bypassDocumentValidation,
13471349 BSONObjBuilder* out) {
13481350 BSONObjBuilder commandBuilder;
13491351
@@ -1377,6 +1379,14 @@ void DBClientBase::_findAndModify(const StringData& ns,
13771379 writeConcern == NULL );
13781380 }
13791381
1382+ if (bypassDocumentValidation) {
1383+ uassert (
1384+ 0 ,
1385+ " bypassDocumentValidation is not supported for findAndModify with this server version." ,
1386+ getMaxWireVersion () >= 4 );
1387+ commandBuilder.append (kBypassDocumentValidationKey , true );
1388+ }
1389+
13801390 BSONObj result;
13811391 bool ok = runCommand (nsGetDB (ns.toString ()), commandBuilder.obj (), result);
13821392
@@ -1393,9 +1403,11 @@ BSONObj DBClientBase::findAndModify(const StringData& ns,
13931403 bool returnNew,
13941404 const BSONObj& sort,
13951405 const BSONObj& fields,
1396- const WriteConcern* wc) {
1406+ const WriteConcern* wc,
1407+ bool bypassDocumentValidation) {
13971408 BSONObjBuilder result;
1398- _findAndModify (ns, query, update, sort, returnNew, upsert, fields, wc, &result);
1409+ _findAndModify (
1410+ ns, query, update, sort, returnNew, upsert, fields, wc, bypassDocumentValidation, &result);
13991411 return result.obj ();
14001412}
14011413
@@ -1405,7 +1417,7 @@ BSONObj DBClientBase::findAndRemove(const StringData& ns,
14051417 const BSONObj& fields,
14061418 const WriteConcern* wc) {
14071419 BSONObjBuilder result;
1408- _findAndModify (ns, query, BSONObj (), sort, false , false , fields, wc, &result);
1420+ _findAndModify (ns, query, BSONObj (), sort, false , false , fields, wc, false , &result);
14091421 return result.obj ();
14101422}
14111423
@@ -2023,14 +2035,18 @@ unsigned long long DBClientConnection::query(stdx::function<void(DBClientCursorB
20232035void DBClientBase::_write (const string& ns,
20242036 const vector<WriteOperation*>& writes,
20252037 bool ordered,
2038+ bool bypassDocumentValidation,
20262039 const WriteConcern* writeConcern,
20272040 WriteResult* writeResult) {
20282041 const WriteConcern* operationWriteConcern = writeConcern ? writeConcern : &getWriteConcern ();
20292042
2030- if (getMaxWireVersion () >= 2 && operationWriteConcern->requiresConfirmation ())
2031- _commandWriter->write (ns, writes, ordered, operationWriteConcern, writeResult);
2043+ if (getMaxWireVersion () >= 2 &&
2044+ (operationWriteConcern->requiresConfirmation () || bypassDocumentValidation))
2045+ _commandWriter->write (
2046+ ns, writes, ordered, bypassDocumentValidation, operationWriteConcern, writeResult);
20322047 else
2033- _wireProtocolWriter->write (ns, writes, ordered, operationWriteConcern, writeResult);
2048+ _wireProtocolWriter->write (
2049+ ns, writes, ordered, bypassDocumentValidation, operationWriteConcern, writeResult);
20342050}
20352051
20362052namespace {
@@ -2070,9 +2086,10 @@ void DBClientBase::insert(const string& ns,
20702086 }
20712087
20722088 bool ordered = !(flags & InsertOption_ContinueOnError);
2089+ bool bypassDocumentValidation = flags & InsertOption_BypassDocumentValidation;
20732090
20742091 WriteResult writeResult;
2075- _write (ns, inserts.ops , ordered, wc, &writeResult);
2092+ _write (ns, inserts.ops , ordered, bypassDocumentValidation, wc, &writeResult);
20762093}
20772094
20782095void DBClientBase::remove (const string& ns, Query obj, bool justOne, const WriteConcern* wc) {
@@ -2087,7 +2104,7 @@ void DBClientBase::remove(const string& ns, Query obj, int flags, const WriteCon
20872104 deletes.enqueue (new DeleteWriteOperation (obj.obj , flags));
20882105
20892106 WriteResult writeResult;
2090- _write (ns, deletes.ops , true , wc, &writeResult);
2107+ _write (ns, deletes.ops , true , false , wc, &writeResult);
20912108}
20922109
20932110void DBClientBase::update (
@@ -2110,16 +2127,18 @@ void DBClientBase::update(
21102127 0 , " update document exceeds maxBsonObjectSize" , obj.objsize () <= getMaxBsonObjectSize ());
21112128 updates.enqueue (new UpdateWriteOperation (query.obj , obj, flags));
21122129
2130+ bool bypassDocumentValidation = flags & UpdateOption_BypassDocumentValidation;
2131+
21132132 WriteResult writeResult;
2114- _write (ns, updates.ops , true , wc, &writeResult);
2133+ _write (ns, updates.ops , true , bypassDocumentValidation, wc, &writeResult);
21152134}
21162135
21172136BulkOperationBuilder DBClientBase::initializeOrderedBulkOp (const std::string& ns) {
2118- return BulkOperationBuilder (this , ns, true );
2137+ return BulkOperationBuilder (this , ns, true , false );
21192138}
21202139
21212140BulkOperationBuilder DBClientBase::initializeUnorderedBulkOp (const std::string& ns) {
2122- return BulkOperationBuilder (this , ns, false );
2141+ return BulkOperationBuilder (this , ns, false , false );
21232142}
21242143
21252144list<BSONObj> DBClientWithCommands::getIndexSpecs (const string& ns, int options) {
0 commit comments