self::RETURN_DOCUMENT_BEFORE, 'upsert' => false, ]; if (isset($options['projection']) && ! is_array($options['projection']) && ! is_object($options['projection'])) { throw InvalidArgumentException::invalidType('"projection" option', $options['projection'], 'array or object'); } if ( ! is_integer($options['returnDocument'])) { throw InvalidArgumentException::invalidType('"returnDocument" option', $options['returnDocument'], 'integer'); } if ($options['returnDocument'] !== self::RETURN_DOCUMENT_AFTER && $options['returnDocument'] !== self::RETURN_DOCUMENT_BEFORE) { throw new InvalidArgumentException('Invalid value for "returnDocument" option: ' . $options['returnDocument']); } if (isset($options['projection'])) { $options['fields'] = $options['projection']; } $options['new'] = $options['returnDocument'] === self::RETURN_DOCUMENT_AFTER; unset($options['projection'], $options['returnDocument']); $this->findAndModify = new FindAndModify( $databaseName, $collectionName, ['query' => $filter, 'update' => $update] + $options ); } /** * Execute the operation. * * @see Executable::execute() * @param Server $server * @return array|object|null * @throws UnsupportedException if collation or write concern is used and unsupported * @throws DriverRuntimeException for other driver errors (e.g. connection errors) */ public function execute(Server $server) { return $this->findAndModify->execute($server); } public function getCommandDocument(Server $server) { return $this->findAndModify->getCommandDocument($server); } }