diff --git a/src/Collection.php b/src/Collection.php index bc31d0c0a..749163f33 100644 --- a/src/Collection.php +++ b/src/Collection.php @@ -37,6 +37,8 @@ class Collection { + private static $wireVersionForFindAndModifyWriteConcern = 4; + private $collectionName; private $databaseName; private $manager; @@ -394,9 +396,14 @@ public function findOne($filter = [], array $options = []) */ public function findOneAndDelete($filter, array $options = []) { - $operation = new FindOneAndDelete($this->databaseName, $this->collectionName, $filter, $options); $server = $this->manager->selectServer(new ReadPreference(ReadPreference::RP_PRIMARY)); + if ( ! isset($options['writeConcern']) && \MongoDB\server_supports_feature($server, self::$wireVersionForFindAndModifyWriteConcern)) { + $options['writeConcern'] = $this->writeConcern; + } + + $operation = new FindOneAndDelete($this->databaseName, $this->collectionName, $filter, $options); + return $operation->execute($server); } @@ -417,9 +424,14 @@ public function findOneAndDelete($filter, array $options = []) */ public function findOneAndReplace($filter, $replacement, array $options = []) { - $operation = new FindOneAndReplace($this->databaseName, $this->collectionName, $filter, $replacement, $options); $server = $this->manager->selectServer(new ReadPreference(ReadPreference::RP_PRIMARY)); + if ( ! isset($options['writeConcern']) && \MongoDB\server_supports_feature($server, self::$wireVersionForFindAndModifyWriteConcern)) { + $options['writeConcern'] = $this->writeConcern; + } + + $operation = new FindOneAndReplace($this->databaseName, $this->collectionName, $filter, $replacement, $options); + return $operation->execute($server); } @@ -440,9 +452,14 @@ public function findOneAndReplace($filter, $replacement, array $options = []) */ public function findOneAndUpdate($filter, $update, array $options = []) { - $operation = new FindOneAndUpdate($this->databaseName, $this->collectionName, $filter, $update, $options); $server = $this->manager->selectServer(new ReadPreference(ReadPreference::RP_PRIMARY)); + if ( ! isset($options['writeConcern']) && \MongoDB\server_supports_feature($server, self::$wireVersionForFindAndModifyWriteConcern)) { + $options['writeConcern'] = $this->writeConcern; + } + + $operation = new FindOneAndUpdate($this->databaseName, $this->collectionName, $filter, $update, $options); + return $operation->execute($server); } diff --git a/src/Operation/FindAndModify.php b/src/Operation/FindAndModify.php index 1212f64e0..7aa9c81b4 100644 --- a/src/Operation/FindAndModify.php +++ b/src/Operation/FindAndModify.php @@ -4,6 +4,7 @@ use MongoDB\Driver\Command; use MongoDB\Driver\Server; +use MongoDB\Driver\WriteConcern; use MongoDB\Exception\InvalidArgumentException; use MongoDB\Exception\InvalidArgumentTypeException; use MongoDB\Exception\UnexpectedValueException; @@ -20,6 +21,7 @@ class FindAndModify implements Executable { private static $wireVersionForDocumentLevelValidation = 4; + private static $wireVersionForWriteConcern = 4; private $databaseName; private $collectionName; @@ -58,6 +60,9 @@ class FindAndModify implements Executable * matches the query. This option is ignored for remove operations. The * default is false. * + * * writeConcern (MongoDB\Driver\WriteConcern): Write concern. This option + * is only supported for server versions >= 3.2. + * * @param string $databaseName Database name * @param string $collectionName Collection name * @param array $options Command options @@ -103,6 +108,10 @@ public function __construct($databaseName, $collectionName, array $options) throw new InvalidArgumentTypeException('"update" option', $options['update'], 'array or object'); } + if (isset($options['writeConcern']) && ! $options['writeConcern'] instanceof WriteConcern) { + throw new InvalidArgumentTypeException('"writeConcern" option', $options['writeConcern'], 'MongoDB\Driver\WriteConcern'); + } + if ( ! is_bool($options['upsert'])) { throw new InvalidArgumentTypeException('"upsert" option', $options['upsert'], 'boolean'); } @@ -181,6 +190,10 @@ private function createCommand(Server $server) $cmd['bypassDocumentValidation'] = $this->options['bypassDocumentValidation']; } + if (isset($this->options['writeConcern']) && \MongoDB\server_supports_feature($server, self::$wireVersionForWriteConcern)) { + $cmd['writeConcern'] = $this->options['writeConcern']; + } + return new Command($cmd); } } diff --git a/src/Operation/FindOneAndDelete.php b/src/Operation/FindOneAndDelete.php index 1871ff1af..6fae51da4 100644 --- a/src/Operation/FindOneAndDelete.php +++ b/src/Operation/FindOneAndDelete.php @@ -32,6 +32,9 @@ class FindOneAndDelete implements Executable * * sort (document): Determines which document the operation modifies if * the query selects multiple documents. * + * * writeConcern (MongoDB\Driver\WriteConcern): Write concern. This option + * is only supported for server versions >= 3.2. + * * @param string $databaseName Database name * @param string $collectionName Collection name * @param array|object $filter Query by which to filter documents diff --git a/src/Operation/FindOneAndReplace.php b/src/Operation/FindOneAndReplace.php index d0dab6acb..c9a912386 100644 --- a/src/Operation/FindOneAndReplace.php +++ b/src/Operation/FindOneAndReplace.php @@ -45,6 +45,9 @@ class FindOneAndReplace implements Executable * * upsert (boolean): When true, a new document is created if no document * matches the query. The default is false. * + * * writeConcern (MongoDB\Driver\WriteConcern): Write concern. This option + * is only supported for server versions >= 3.2. + * * @param string $databaseName Database name * @param string $collectionName Collection name * @param array|object $filter Query by which to filter documents diff --git a/src/Operation/FindOneAndUpdate.php b/src/Operation/FindOneAndUpdate.php index bca10aa39..bdfa3541c 100644 --- a/src/Operation/FindOneAndUpdate.php +++ b/src/Operation/FindOneAndUpdate.php @@ -45,6 +45,9 @@ class FindOneAndUpdate implements Executable * * upsert (boolean): When true, a new document is created if no document * matches the query. The default is false. * + * * writeConcern (MongoDB\Driver\WriteConcern): Write concern. This option + * is only supported for server versions >= 3.2. + * * @param string $databaseName Database name * @param string $collectionName Collection name * @param array|object $filter Query by which to filter documents diff --git a/tests/Operation/FindAndModifyTest.php b/tests/Operation/FindAndModifyTest.php index fc150c2c1..161d5842b 100644 --- a/tests/Operation/FindAndModifyTest.php +++ b/tests/Operation/FindAndModifyTest.php @@ -55,6 +55,10 @@ public function provideInvalidConstructorOptions() $options[][] = ['upsert' => $value]; } + foreach ($this->getInvalidWriteConcernValues() as $value) { + $options[][] = ['writeConcern' => $value]; + } + return $options; }