collection().updateMany(where, set)
}
+ suspend fun change(where: Bson, set: Bson) {
+ collection().updateOne(where, set, UpdateOptions().upsert(true))
+ }
+
suspend fun remove(where: Bson) {
collection().deleteMany(where)
}
import com.mongodb.client.model.Accumulators
import com.mongodb.client.model.Aggregates
import com.mongodb.client.model.Filters
+import com.mongodb.client.model.Updates
import info.mechyrdia.lore.dateTime
import io.ktor.server.application.*
import io.ktor.server.plugins.*
}
suspend fun visit(path: String, visitor: String) {
- val data = Table.locate(
+ Table.change(
Filters.and(
Filters.eq(PageVisitData::path.serialName, path),
Filters.eq(PageVisitData::visitor.serialName, visitor)
+ ),
+ Updates.combine(
+ Updates.inc(PageVisitData::visits.serialName, 1),
+ Updates.set(PageVisitData::lastVisit.serialName, Instant.now()),
+ Updates.setOnInsert(MONGODB_ID_KEY, Id<PageVisitData>())
)
)
- if (data == null)
- Table.put(
- PageVisitData(
- path = path,
- visitor = visitor,
- visits = 1L,
- )
- )
- else
- Table.put(
- data.copy(
- visits = data.visits + 1,
- lastVisit = Instant.now()
- )
- )
}
suspend fun totalVisits(path: String): PageVisitTotals {