Шаблон Mongo — создать или обновить

#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)