diff --git a/src/Mongolid/DataMapper/BulkWrite.php b/src/Mongolid/DataMapper/BulkWrite.php index af7cb82f..0bc0217b 100644 --- a/src/Mongolid/DataMapper/BulkWrite.php +++ b/src/Mongolid/DataMapper/BulkWrite.php @@ -84,12 +84,17 @@ public function setBulkWrite(MongoBulkWrite $bulkWrite) * @param ObjectID|string $id * @param array $dataToSet * @param array $options + * @param string $operator */ - public function updateOne($id, array $dataToSet, array $options = ['upsert' => true]) - { + public function updateOne( + $id, + array $dataToSet, + array $options = ['upsert' => true], + string $operator = '$set' + ) { return $this->getBulkWrite()->update( ['_id' => $id], - ['$set' => $dataToSet], + [$operator => $dataToSet], $options ); } diff --git a/tests/Mongolid/DataMapper/BulkWriteTest.php b/tests/Mongolid/DataMapper/BulkWriteTest.php index 9c5e659e..47027a01 100644 --- a/tests/Mongolid/DataMapper/BulkWriteTest.php +++ b/tests/Mongolid/DataMapper/BulkWriteTest.php @@ -83,6 +83,35 @@ public function testShouldAddUpdateOneOperationToBulkWrite() $bulkWrite->updateOne($id, $data); } + public function testShouldUpdateOneWithUnsetOperationToBulkWrite() + { + // Arrange + $entity = m::mock(HasSchemaInterface::class); + $mongoBulkWrite = m::mock(new MongoBulkWrite()); + + $id = '123'; + $data = ['name' => 'John']; + + // Expect + $entity->shouldReceive('getSchema') + ->withNoArgs() + ->once(); + + $mongoBulkWrite->shouldReceive('update') + ->with(['_id' => $id], ['$unset' => $data], ['upsert' => true]) + ->once(); + + $bulkWrite = m::mock(BulkWrite::class.'[getBulkWrite]', [$entity]); + + $bulkWrite->shouldReceive('getBulkWrite') + ->with() + ->once() + ->andReturn($mongoBulkWrite); + + // Act + $bulkWrite->updateOne($id, $data, ['upsert' => true], '$unset'); + } + public function testShouldExecuteBulkWrite() { $entity = m::mock(HasSchemaInterface::class);