Description
According to the documentation, it is possible to create a time series collection via MongoTemplate
by either providing explicit CollectionOptions
or a class annotated with @TimeSeries
:
@TimeSeries(timeField = "timestamp")
record MyTimeSeries(@Id String id, Instant timestamp, String value) {}
mongoTemplate.createCollection(MyTimeSeries.class)
in which case the CollectionOptions
are derived from the annotation:
However, if you want to create the collection with a custom name (not derived from the class), there is currently no option for deriving the CollectionOptions
from the annotation. The only overloads of mongoTemplate.createCollection
that take a String collectionName
also require explicit CollectionOptions
.
Using mongoTemplate.save(value, "myCustomName")
is a non-starter since it does not read the entity metadata and just creates a basic collection (not a time series) with no other options.
Custom names are important for several widespread use cases, for example collection-level multi-tenancy, where you would create multiple collection with the same definition to segregate data for different tenants, or any other types of data segmentation.
I propose new methods to create a collection that take both the collectionName and the entityClass as inputs:
public <T> MongoCollection<Document> createCollection(String collectionName, Class<T> entityClass) {
return createCollection(collectionName, entityClass,
operations.forType(entityClass).getCollectionOptions());
}
public <T> MongoCollection<Document> createCollection(String collectionName, Class<T> entityClass,
@Nullable CollectionOptions collectionOptions) {
Assert.notNull(collectionName, "CollectionName must not be null");
Assert.notNull(entityClass, "EntityClass must not be null");
return doCreateCollection(collectionName,
operations.convertToCreateCollectionOptions(collectionOptions, entityClass));
}
Activity
mp911de commentedon Apr 8, 2024
Let me see whether I understand your request correctly. You're looking for a way to create a timeseries collection that derives its
CollectionOptions
from aClass
but you want to specify a custom name?If so, then this is not possible. We do not expose our utilities that derive information from annotations for application-code usage. These utilities are private and not part of our public API.
You can call however
MongoOperations.createCollection(String collectionName, @Nullable CollectionOptions collectionOptions)
gbaso commentedon Apr 9, 2024
Yes, that is correct.
There is no need to expose those utilities. New overloads for
MongoOperations.createCollection
would be sufficient.This is precisely what
MongoOperations.createCollection(Class<T> entityClass)
already does. Despite the misleading javadoc, it doesn't just derive the collection name from the entity class, it also derives theCollectionOptions
, which is very convenient for time series.