PropertyNameStrategy
Allows configuring how the DSL generates MongoDB paths from KProperty1 instances.
Introduction
The KtMongo library uses type-safe Field instances to represent paths in MongoDB queries. For example,
class User(
val profile: Profile,
)
class Profile(
val name: String,
)
with(FieldDsl(PropertyNameStrategy.Default)) {
User::profile / Profile::name
}which results in the path profile.name.
To build this path, the PropertyNameStrategy.Default strategy uses the name of the fields as they are written in Kotlin code.
Customizing
If you use a serialization library that allows renaming fields, like Jackson or KotlinX.Serialization, you may find a mismatch between how your documents are generated and how KtMongo queries try to access them.
@Serializable
data class User(
@SerialName("f")
val aSuperLongField: String,
)
with(FieldDsl(PropertyNameStrategy.Default)) {
User::aSuperLongField
}which results in the path aSuperLongField which is incorrect: it should be f. In this situation, your KtMongo queries will refer to paths that don't exist.
It is not feasible for KtMongo to provide built-in support for all serialization libraries. However, we do support:
The annotations
@BsonIdand@SerialNameused by the KMongo library, with the modulesdev.opensavvy.ktmongo:driver-coroutines-kmongoordev.opensavvy.ktmongo:driver-sync-kmongo.
You can also create your own strategy to support any other serialization library. To do this, implement this interface. All KtMongo entry-points should provide a way to override the default strategy, for example with the official drivers:
val client = MongoClient.create()
val database = client.getDatabase("my-project")
val collection = database.getCollection<User>("users")
.asKtMongo(
nameStrategy = yourCustomNameStrategy,
)The different operators that build Field instances are in the FieldDsl interface.
Inheritors
Types
Default implementation of PropertyNameStrategy, which always uses the property name exactly as it is written in Kotlin code.
Functions
Generates the name of a property.