Skip to content

MultiplatformMongoCollection

A collection stores related documents together.

The Multiplatform driver provides a coroutine-aware API which works on all supported Kotlin platforms.

Usually, all documents in a collection have the same shape (the same fields). However, heterogeneous structure can be achieved by using:

  • Kotlin collections, like List and Set, the embed an arbitrary number of items.

  • Polymorphism, for example with sealed class, to have different fields based on a discriminator.

To avoid name collisions, collections are grouped into databases.

To obtain a collection, see MultiplatformMongoDatabase.collection.

Size limit

A MongoDB document cannot exceed 16 MiB.

You can measure the size of a document with opensavvy.ktmongo.bson.BsonDocument.toByteArray followed by ByteArray.size.

The maximum nesting is 100 levels. Each document or array adds a level.

External resources

Types

UpsertResult

Properties

context

database

The MultiplatformMongoDatabase that contains this collection.

factory

abstract override val factory: BsonFactory

fullyQualifiedName

open override val fullyQualifiedName: String

name

abstract val name: String

objectIdGenerator

propertyNameStrategy

type

@LowLevelApi
abstract val type: KType

Functions

aggregate

bulkWrite

abstract suspend fun bulkWrite(
    options: BulkWriteOptions<Document>.() -> Unit, 
    filter: FilterQuery<Document>.() -> Unit, 
    operations: BulkWrite<Document>.() -> Unit
)

count

abstract suspend fun count(): Long
abstract suspend fun count(options: CountOptions<Document>.() -> Unit, predicate: FilterQuery<Document>.() -> Unit): Long

countEstimated

abstract suspend fun countEstimated(): Long

create

abstract suspend fun create(options: CreateCollectionOptions<Document>.() -> Unit)

deleteMany

abstract suspend fun deleteMany(options: DeleteManyOptions<Document>.() -> Unit, filter: FilterQuery<Document>.() -> Unit)

deleteOne

abstract suspend fun deleteOne(options: DeleteOneOptions<Document>.() -> Unit, filter: FilterQuery<Document>.() -> Unit)

drop

abstract suspend fun drop(options: DropOptions<Document>.() -> Unit)

exists

open suspend fun exists(options: CountOptions<Document>.() -> Unit, predicate: FilterQuery<Document>.() -> Unit): Boolean

filter

abstract override fun filter(filter: FilterQuery<Document>.() -> Unit): MultiplatformMongoCollection<Document>

find

abstract override fun find(): MultiplatformMongoIterable<Document>
abstract override fun find(options: FindOptions<Document>.() -> Unit, filter: FilterQuery<Document>.() -> Unit): MultiplatformMongoIterable<Document>

findOne

open suspend fun findOne(options: FindOptions<Document>.() -> Unit, filter: FilterQuery<Document>.() -> Unit): Document?

findOneAndUpdate

abstract suspend fun findOneAndUpdate(
    options: UpdateOptions<Document>.() -> Unit, 
    filter: FilterQuery<Document>.() -> Unit, 
    update: UpdateQuery<Document>.() -> Unit
): Document?

insertMany

abstract suspend fun insertMany(documents: Iterable<Document>, options: InsertManyOptions<Document>.() -> Unit)
open suspend fun insertMany(vararg documents: Document, options: InsertManyOptions<Document>.() -> Unit)

insertOne

abstract suspend fun insertOne(document: Document, options: InsertOneOptions<Document>.() -> Unit)

newId

open override fun newId(): ObjectId

replaceOne

abstract suspend fun replaceOne(
    options: ReplaceOptions<Document>.() -> Unit, 
    filter: FilterQuery<Document>.() -> Unit, 
    document: Document
)

repsertOne

abstract suspend fun repsertOne(
    options: ReplaceOptions<Document>.() -> Unit, 
    filter: FilterQuery<Document>.() -> Unit, 
    document: Document
)

unsafeCast

Overwrites the represented type of this value.

This method can be useful to bypass type checks.

Example

If we know there are some documents that have the wrong format, we can use unsafeCast to find them without needing to add their fields to the production DTO.

class User(
    val _id: ObjectId,
    val name: String,
)

users.unsafeCast<BsonDocument>() // Treat all data as arbitrary BSON documents
    .find { BsonDocument.get<String?>("oldField") ne null }
    .forEach {
        println(it["oldField"]?.decodeString())
    }

updateMany

@IgnorableReturnValue
abstract suspend fun updateMany(
    options: UpdateOptions<Document>.() -> Unit, 
    filter: FilterQuery<Document>.() -> Unit, 
    update: UpdateQuery<Document>.() -> Unit
): UpdateOperations.UpdateResult

updateManyWithPipeline

updateOne

@IgnorableReturnValue
abstract suspend fun updateOne(
    options: UpdateOptions<Document>.() -> Unit, 
    filter: FilterQuery<Document>.() -> Unit, 
    update: UpdateQuery<Document>.() -> Unit
): UpdateOperations.UpdateResult

updateOneWithPipeline

upsertOne

@IgnorableReturnValue
abstract suspend override fun upsertOne(
    options: UpdateOptions<Document>.() -> Unit, 
    filter: FilterQuery<Document>.() -> Unit, 
    update: UpsertQuery<Document>.() -> Unit
): MultiplatformMongoCollection.UpsertResult

upsertOneWithPipeline