diff --git a/lib/Doctrine/ODM/MongoDB/UnitOfWork.php b/lib/Doctrine/ODM/MongoDB/UnitOfWork.php index a2284b861..20150702b 100644 --- a/lib/Doctrine/ODM/MongoDB/UnitOfWork.php +++ b/lib/Doctrine/ODM/MongoDB/UnitOfWork.php @@ -1129,7 +1129,7 @@ private function persistNew(ClassMetadata $class, object $document): void $upsert = false; if ($class->identifier) { $idValue = $class->getIdentifierValue($document); - $upsert = ! $class->isEmbeddedDocument && $idValue !== null; + $upsert = ! $class->isEmbeddedDocument && ! $class->timeSeriesOptions && $idValue !== null; if ($class->generatorType === ClassMetadata::GENERATOR_TYPE_NONE && $idValue === null) { throw new InvalidArgumentException(sprintf( diff --git a/tests/Doctrine/ODM/MongoDB/Tests/BaseTestCase.php b/tests/Doctrine/ODM/MongoDB/Tests/BaseTestCase.php index 67652d5c2..4e5b0d8ea 100644 --- a/tests/Doctrine/ODM/MongoDB/Tests/BaseTestCase.php +++ b/tests/Doctrine/ODM/MongoDB/Tests/BaseTestCase.php @@ -211,6 +211,11 @@ protected function requireMongoDB42(string $message): void $this->requireVersion($this->getServerVersion(), '4.2.0', '<', $message); } + protected function requireMongoDB63(string $message): void + { + $this->requireVersion($this->getServerVersion(), '6.3.0', '<', $message); + } + protected static function getUri(bool $useMultipleMongoses = true): string { $uri = getenv('DOCTRINE_MONGODB_SERVER') ?: DOCTRINE_MONGODB_SERVER; diff --git a/tests/Doctrine/ODM/MongoDB/Tests/Functional/TimeSeriesTest.php b/tests/Doctrine/ODM/MongoDB/Tests/Functional/TimeSeriesTest.php new file mode 100644 index 000000000..9556f298c --- /dev/null +++ b/tests/Doctrine/ODM/MongoDB/Tests/Functional/TimeSeriesTest.php @@ -0,0 +1,70 @@ +requireMongoDB63('Time series tests require MonogDB 6.3 or newer'); + } + + public function testCreateTimeSeriesCollection(): void + { + $this->createTimeSeriesCollection(TimeSeriesDocument::class); + + $indexes = iterator_to_array($this->dm->getDocumentCollection(TimeSeriesDocument::class)->listIndexes()); + + $this->assertCount(1, $indexes); + + self::assertSame(['metadata' => 1, 'time' => 1], $indexes[0]['key']); + } + + public function testCreateTimeSeriesDocumentWithoutId(): void + { + $this->createTimeSeriesCollection(TimeSeriesDocument::class); + + $document = new TimeSeriesDocument(); + $document->time = new DateTime('2025-02-05T08:53:12+00:00'); + $document->value = 9; + $document->metadata = 'energy'; + + $this->dm->persist($document); + $this->dm->flush(); + + $this->assertCount(1, $this->dm->getDocumentCollection(TimeSeriesDocument::class)->find()); + } + + public function testCreateTimeSeriesDocumentWithId(): void + { + $this->createTimeSeriesCollection(TimeSeriesDocument::class); + + $document = new TimeSeriesDocument(); + $document->id = (string) new ObjectId(); + $document->time = new DateTime('2025-02-05T08:53:12+00:00'); + $document->value = 9; + $document->metadata = 'energy'; + + $this->dm->persist($document); + $this->dm->flush(); + + $this->assertCount(1, $this->dm->getDocumentCollection(TimeSeriesDocument::class)->find()); + } + + private function createTimeSeriesCollection(string $documentClass): void + { + $this->dm->getSchemaManager()->createDocumentCollection($documentClass); + $this->dm->getSchemaManager()->ensureDocumentIndexes($documentClass); + } +}