#mongodb #kotlin #mongotemplate
#mongodb #kotlin #mongotemplate
Вопрос:
У меня есть коллекция, которая представляет элементы, коллекция имеет несколько индексов (а не один уникальный идентификатор). модель выглядит примерно так:
data class Item {
_id
customer_id
item_type: (game / movie / equipment)
}
Я хочу создать запрос, который использует эти индексы для поиска или создания, например:
val item: Item
mongoTemplate.findOrCreate(customer_id: x, item_type: y, item)
Я, конечно, могу гарантировать, что не будет 2 элементов с одинаковым идентификатором и типом customer_id.
Ответ №1:
Вы можете создать функцию, подобную этой:
fun MongoTemplate.findOrCreate(customer_id: String, item_type: String): Item {
val query = Query.query(
Criteria().andOperator(
Criteria.where("customer_id").`is`(customer_id),
Criteria.where("item_type").`is`(item_type)
)
)
return findOne(query, Item::class.java, "collectionName")
?: insert(Item(customer_id, item_type), "collectionName")
}
MongoTemplate.findOne вернет объект или null, если он не найден, если null, мы используем MongoTemplate.insert для вставки нового объекта. Вставка также вернет объект.
Вы бы вызвали эту функцию следующим образом:
val item: Item = mongoTemplate.findOrCreate(customer_id: x, item_type: y)