diff --git a/src/MongoDB/BulkWrite.c b/src/MongoDB/BulkWrite.c index 015d6334a..e1e0177a5 100644 --- a/src/MongoDB/BulkWrite.c +++ b/src/MongoDB/BulkWrite.c @@ -137,6 +137,7 @@ static bool php_phongo_bulkwrite_update_apply_options(bson_t *boptions, zval *zo PHONGO_BULKWRITE_APPEND_BOOL("multi", multi); PHONGO_BULKWRITE_APPEND_BOOL("upsert", upsert); + PHONGO_BULKWRITE_OPT_DOCUMENT("arrayFilters"); PHONGO_BULKWRITE_OPT_DOCUMENT("collation"); return true; diff --git a/tests/bulk/bulkwrite-update-arrayFilters-001.phpt b/tests/bulk/bulkwrite-update-arrayFilters-001.phpt new file mode 100644 index 000000000..a860be933 --- /dev/null +++ b/tests/bulk/bulkwrite-update-arrayFilters-001.phpt @@ -0,0 +1,82 @@ +--TEST-- +MongoDB\Driver\BulkWrite::update with arrayFilters +--SKIPIF-- + + +--FILE-- +insert([ '_id' => 1, 'grades' => [ 95, 92, 90 ] ]); +$bulk->insert([ '_id' => 2, 'grades' => [ 98, 100, 102 ] ]); +$bulk->insert([ '_id' => 3, 'grades' => [ 95, 110, 100 ] ]); + +$manager->executeBulkWrite(DATABASE_NAME . '.' . COLLECTION_NAME, $bulk); + +$updateBulk = new MongoDB\Driver\BulkWrite(); + +$query = new MongoDB\Driver\Query(['grades' => ['$gte' => 100]]); +$update = [ '$set' => [ 'grades.$[element]' => 100 ] ]; +$options = [ + 'arrayFilters' => [ [ 'element' => [ '$gte' => 100 ] ] ], + 'multi' => true +]; + +$updateBulk->update($query, $update, $options); +$manager->executeBulkWrite(DATABASE_NAME . '.' . COLLECTION_NAME, $updateBulk); + +$cursor = $manager->executeQuery( DATABASE_NAME . '.' . COLLECTION_NAME, new \MongoDB\Driver\Query([])); +var_dump($cursor->toArray()); +?> +===DONE=== + +--EXPECTF-- +array(%d) { + [0]=> + object(stdClass)#%d (%d) { + ["_id"]=> + int(1) + ["grades"]=> + array(%d) { + [0]=> + int(95) + [1]=> + int(92) + [2]=> + int(90) + } + } + [1]=> + object(stdClass)#%d (%d) { + ["_id"]=> + int(2) + ["grades"]=> + array(%d) { + [0]=> + int(98) + [1]=> + int(100) + [2]=> + int(100) + } + } + [2]=> + object(stdClass)#%d (%d) { + ["_id"]=> + int(3) + ["grades"]=> + array(%d) { + [0]=> + int(95) + [1]=> + int(100) + [2]=> + int(100) + } + } +} +===DONE=== diff --git a/tests/command/findAndModify-001.phpt b/tests/command/findAndModify-001.phpt new file mode 100644 index 000000000..3f5d8c753 --- /dev/null +++ b/tests/command/findAndModify-001.phpt @@ -0,0 +1,82 @@ +--TEST-- +MongoDB\Driver\Command with findAndModify and arrayFilters +--SKIPIF-- + + +--FILE-- +insert([ '_id' => 1, 'grades' => [ 95, 92, 90 ] ]); +$bulk->insert([ '_id' => 2, 'grades' => [ 98, 100, 102 ] ]); +$bulk->insert([ '_id' => 3, 'grades' => [ 95, 110, 100 ] ]); + +$manager->executeBulkWrite(DATABASE_NAME . '.' . COLLECTION_NAME, $bulk); + +$command = new MongoDB\Driver\Command([ + 'findAndModify' => COLLECTION_NAME, + 'query' => ['grades' => [ '$gt' => 100 ] ], + 'update' => ['$set' => [ 'grades.$[element]' => 100 ] ], + 'arrayFilters' => [ [ 'element' => [ '$gt' => 100 ] ] ], +]); + +// Running this twice, because findAndModify only updates the first document +// it finds. +$manager->executeCommand(DATABASE_NAME, $command); +$manager->executeCommand(DATABASE_NAME, $command); + +$cursor = $manager->executeQuery( DATABASE_NAME . '.' . COLLECTION_NAME, new \MongoDB\Driver\Query([])); +var_dump($cursor->toArray()); +?> +===DONE=== + +--EXPECTF-- +array(%d) { + [0]=> + object(stdClass)#%d (%d) { + ["_id"]=> + int(1) + ["grades"]=> + array(%d) { + [0]=> + int(95) + [1]=> + int(92) + [2]=> + int(90) + } + } + [1]=> + object(stdClass)#%d (%d) { + ["_id"]=> + int(2) + ["grades"]=> + array(%d) { + [0]=> + int(98) + [1]=> + int(100) + [2]=> + int(100) + } + } + [2]=> + object(stdClass)#%d (%d) { + ["_id"]=> + int(3) + ["grades"]=> + array(%d) { + [0]=> + int(95) + [1]=> + int(100) + [2]=> + int(100) + } + } +} +===DONE=== diff --git a/tests/command/update-001.phpt b/tests/command/update-001.phpt new file mode 100644 index 000000000..38a88e78c --- /dev/null +++ b/tests/command/update-001.phpt @@ -0,0 +1,82 @@ +--TEST-- +MongoDB\Driver\Command with update and arrayFilters +--SKIPIF-- + + +--FILE-- +insert([ '_id' => 1, 'grades' => [ 95, 92, 90 ] ]); +$bulk->insert([ '_id' => 2, 'grades' => [ 98, 100, 102 ] ]); +$bulk->insert([ '_id' => 3, 'grades' => [ 95, 110, 100 ] ]); + +$manager->executeBulkWrite(DATABASE_NAME . '.' . COLLECTION_NAME, $bulk); + +$command = new MongoDB\Driver\Command([ + 'update' => COLLECTION_NAME, + 'updates' => [[ + 'q' => [ 'grades' => [ '$gte' => 100 ] ], + 'u' => [ '$set' => [ 'grades.$[element]' => 100 ] ], + 'arrayFilters' => [ [ 'element' => [ '$gte' => 100 ] ] ], + 'multi' => true + ]], +]); + +$manager->executeCommand(DATABASE_NAME, $command); + +$cursor = $manager->executeQuery( DATABASE_NAME . '.' . COLLECTION_NAME, new \MongoDB\Driver\Query([])); +var_dump($cursor->toArray()); +?> +===DONE=== + +--EXPECTF-- +array(%d) { + [0]=> + object(stdClass)#%d (%d) { + ["_id"]=> + int(1) + ["grades"]=> + array(%d) { + [0]=> + int(95) + [1]=> + int(92) + [2]=> + int(90) + } + } + [1]=> + object(stdClass)#%d (%d) { + ["_id"]=> + int(2) + ["grades"]=> + array(%d) { + [0]=> + int(98) + [1]=> + int(100) + [2]=> + int(100) + } + } + [2]=> + object(stdClass)#%d (%d) { + ["_id"]=> + int(3) + ["grades"]=> + array(%d) { + [0]=> + int(95) + [1]=> + int(100) + [2]=> + int(100) + } + } +} +===DONE===