Skip to content

Commit 13a4c44

Browse files
committed
Merged pull request #669
2 parents 7e02c4a + 6d26202 commit 13a4c44

File tree

4 files changed

+247
-0
lines changed

4 files changed

+247
-0
lines changed

src/MongoDB/BulkWrite.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ static bool php_phongo_bulkwrite_update_apply_options(bson_t *boptions, zval *zo
137137

138138
PHONGO_BULKWRITE_APPEND_BOOL("multi", multi);
139139
PHONGO_BULKWRITE_APPEND_BOOL("upsert", upsert);
140+
PHONGO_BULKWRITE_OPT_DOCUMENT("arrayFilters");
140141
PHONGO_BULKWRITE_OPT_DOCUMENT("collation");
141142

142143
return true;
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
--TEST--
2+
MongoDB\Driver\BulkWrite::update with arrayFilters
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
5+
<?php NEEDS('STANDALONE'); CLEANUP(STANDALONE); ?>
6+
--FILE--
7+
<?php
8+
require_once __DIR__ . "/../utils/basic.inc";
9+
10+
$manager = new MongoDB\Driver\Manager(STANDALONE);
11+
12+
$bulk = new MongoDB\Driver\BulkWrite();
13+
14+
$bulk->insert([ '_id' => 1, 'grades' => [ 95, 92, 90 ] ]);
15+
$bulk->insert([ '_id' => 2, 'grades' => [ 98, 100, 102 ] ]);
16+
$bulk->insert([ '_id' => 3, 'grades' => [ 95, 110, 100 ] ]);
17+
18+
$manager->executeBulkWrite(DATABASE_NAME . '.' . COLLECTION_NAME, $bulk);
19+
20+
$updateBulk = new MongoDB\Driver\BulkWrite();
21+
22+
$query = new MongoDB\Driver\Query(['grades' => ['$gte' => 100]]);
23+
$update = [ '$set' => [ 'grades.$[element]' => 100 ] ];
24+
$options = [
25+
'arrayFilters' => [ [ 'element' => [ '$gte' => 100 ] ] ],
26+
'multi' => true
27+
];
28+
29+
$updateBulk->update($query, $update, $options);
30+
$manager->executeBulkWrite(DATABASE_NAME . '.' . COLLECTION_NAME, $updateBulk);
31+
32+
$cursor = $manager->executeQuery( DATABASE_NAME . '.' . COLLECTION_NAME, new \MongoDB\Driver\Query([]));
33+
var_dump($cursor->toArray());
34+
?>
35+
===DONE===
36+
<?php exit(0); ?>
37+
--EXPECTF--
38+
array(%d) {
39+
[0]=>
40+
object(stdClass)#%d (%d) {
41+
["_id"]=>
42+
int(1)
43+
["grades"]=>
44+
array(%d) {
45+
[0]=>
46+
int(95)
47+
[1]=>
48+
int(92)
49+
[2]=>
50+
int(90)
51+
}
52+
}
53+
[1]=>
54+
object(stdClass)#%d (%d) {
55+
["_id"]=>
56+
int(2)
57+
["grades"]=>
58+
array(%d) {
59+
[0]=>
60+
int(98)
61+
[1]=>
62+
int(100)
63+
[2]=>
64+
int(100)
65+
}
66+
}
67+
[2]=>
68+
object(stdClass)#%d (%d) {
69+
["_id"]=>
70+
int(3)
71+
["grades"]=>
72+
array(%d) {
73+
[0]=>
74+
int(95)
75+
[1]=>
76+
int(100)
77+
[2]=>
78+
int(100)
79+
}
80+
}
81+
}
82+
===DONE===

tests/command/findAndModify-001.phpt

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
--TEST--
2+
MongoDB\Driver\Command with findAndModify and arrayFilters
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
5+
<?php NEEDS('STANDALONE'); CLEANUP(STANDALONE); ?>
6+
--FILE--
7+
<?php
8+
require_once __DIR__ . "/../utils/basic.inc";
9+
10+
$manager = new MongoDB\Driver\Manager(STANDALONE);
11+
12+
$bulk = new MongoDB\Driver\BulkWrite();
13+
14+
$bulk->insert([ '_id' => 1, 'grades' => [ 95, 92, 90 ] ]);
15+
$bulk->insert([ '_id' => 2, 'grades' => [ 98, 100, 102 ] ]);
16+
$bulk->insert([ '_id' => 3, 'grades' => [ 95, 110, 100 ] ]);
17+
18+
$manager->executeBulkWrite(DATABASE_NAME . '.' . COLLECTION_NAME, $bulk);
19+
20+
$command = new MongoDB\Driver\Command([
21+
'findAndModify' => COLLECTION_NAME,
22+
'query' => ['grades' => [ '$gt' => 100 ] ],
23+
'update' => ['$set' => [ 'grades.$[element]' => 100 ] ],
24+
'arrayFilters' => [ [ 'element' => [ '$gt' => 100 ] ] ],
25+
]);
26+
27+
// Running this twice, because findAndModify only updates the first document
28+
// it finds.
29+
$manager->executeCommand(DATABASE_NAME, $command);
30+
$manager->executeCommand(DATABASE_NAME, $command);
31+
32+
$cursor = $manager->executeQuery( DATABASE_NAME . '.' . COLLECTION_NAME, new \MongoDB\Driver\Query([]));
33+
var_dump($cursor->toArray());
34+
?>
35+
===DONE===
36+
<?php exit(0); ?>
37+
--EXPECTF--
38+
array(%d) {
39+
[0]=>
40+
object(stdClass)#%d (%d) {
41+
["_id"]=>
42+
int(1)
43+
["grades"]=>
44+
array(%d) {
45+
[0]=>
46+
int(95)
47+
[1]=>
48+
int(92)
49+
[2]=>
50+
int(90)
51+
}
52+
}
53+
[1]=>
54+
object(stdClass)#%d (%d) {
55+
["_id"]=>
56+
int(2)
57+
["grades"]=>
58+
array(%d) {
59+
[0]=>
60+
int(98)
61+
[1]=>
62+
int(100)
63+
[2]=>
64+
int(100)
65+
}
66+
}
67+
[2]=>
68+
object(stdClass)#%d (%d) {
69+
["_id"]=>
70+
int(3)
71+
["grades"]=>
72+
array(%d) {
73+
[0]=>
74+
int(95)
75+
[1]=>
76+
int(100)
77+
[2]=>
78+
int(100)
79+
}
80+
}
81+
}
82+
===DONE===

tests/command/update-001.phpt

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
--TEST--
2+
MongoDB\Driver\Command with update and arrayFilters
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
5+
<?php NEEDS('STANDALONE'); CLEANUP(STANDALONE); ?>
6+
--FILE--
7+
<?php
8+
require_once __DIR__ . "/../utils/basic.inc";
9+
10+
$manager = new MongoDB\Driver\Manager(STANDALONE);
11+
12+
$bulk = new MongoDB\Driver\BulkWrite();
13+
14+
$bulk->insert([ '_id' => 1, 'grades' => [ 95, 92, 90 ] ]);
15+
$bulk->insert([ '_id' => 2, 'grades' => [ 98, 100, 102 ] ]);
16+
$bulk->insert([ '_id' => 3, 'grades' => [ 95, 110, 100 ] ]);
17+
18+
$manager->executeBulkWrite(DATABASE_NAME . '.' . COLLECTION_NAME, $bulk);
19+
20+
$command = new MongoDB\Driver\Command([
21+
'update' => COLLECTION_NAME,
22+
'updates' => [[
23+
'q' => [ 'grades' => [ '$gte' => 100 ] ],
24+
'u' => [ '$set' => [ 'grades.$[element]' => 100 ] ],
25+
'arrayFilters' => [ [ 'element' => [ '$gte' => 100 ] ] ],
26+
'multi' => true
27+
]],
28+
]);
29+
30+
$manager->executeCommand(DATABASE_NAME, $command);
31+
32+
$cursor = $manager->executeQuery( DATABASE_NAME . '.' . COLLECTION_NAME, new \MongoDB\Driver\Query([]));
33+
var_dump($cursor->toArray());
34+
?>
35+
===DONE===
36+
<?php exit(0); ?>
37+
--EXPECTF--
38+
array(%d) {
39+
[0]=>
40+
object(stdClass)#%d (%d) {
41+
["_id"]=>
42+
int(1)
43+
["grades"]=>
44+
array(%d) {
45+
[0]=>
46+
int(95)
47+
[1]=>
48+
int(92)
49+
[2]=>
50+
int(90)
51+
}
52+
}
53+
[1]=>
54+
object(stdClass)#%d (%d) {
55+
["_id"]=>
56+
int(2)
57+
["grades"]=>
58+
array(%d) {
59+
[0]=>
60+
int(98)
61+
[1]=>
62+
int(100)
63+
[2]=>
64+
int(100)
65+
}
66+
}
67+
[2]=>
68+
object(stdClass)#%d (%d) {
69+
["_id"]=>
70+
int(3)
71+
["grades"]=>
72+
array(%d) {
73+
[0]=>
74+
int(95)
75+
[1]=>
76+
int(100)
77+
[2]=>
78+
int(100)
79+
}
80+
}
81+
}
82+
===DONE===

0 commit comments

Comments
 (0)