Автоматическое приращение в MongoDB для сохранения последовательности уникальных идентификаторов пользователей

Я создаю систему аналитики, вызов API предоставит уникальный идентификатор пользователя, но он не последовательный и слишком разреженный.

Мне нужно дать каждому уникальному идентификатору пользователя идентификатор автоматического увеличения, чтобы отметить точку данных аналитики в битовом массиве / битовом наборе. Таким образом, первое взаимодействие с пользователем будет соответствовать первому биту битового массива, второй пользователь будет вторым битом в битовом массиве и т. Д.

Так есть ли надежный и быстрый способ генерировать инкрементные уникальные идентификаторы пользователя в MongoDB?

21
задан est 5 December 2011 в 10:38
поделиться

1 ответ

У меня была подобная проблема, а именно, я интересовался генерацией уникальных чисел, которые могут использоваться в качестве идентификаторов, но не имеют к. Я предложил следующее решение. Сначала инициализировать набор:

fun create(mongo: MongoTemplate) {
        mongo.db.getCollection("sequence")
                .insertOne(Document(mapOf("_id" to "globalCounter", "sequenceValue" to 0L)))
    }

затем сервис, которые возвращаются уникальный (и возрастающий) числа:

@Service
class IdCounter(val mongoTemplate: MongoTemplate) {

    companion object {
        const val collection = "sequence"
    }

    private val idField = "_id"
    private val idValue = "globalCounter"
    private val sequence = "sequenceValue"

    fun nextValue(): Long {
        val filter = Document(mapOf(idField to idValue))
        val update = Document("\$inc", Document(mapOf(sequence to 1)))
        val updated: Document = mongoTemplate.db.getCollection(collection).findOneAndUpdate(filter, update)!!
        return updated[sequence] as Long
    }
}

я полагаю, что идентификатору не связали слабые места с параллельной средой, от которой могут пострадать некоторые из других решений.

0
ответ дан 29 November 2019 в 20:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: