Я создаю систему аналитики, вызов API предоставит уникальный идентификатор пользователя, но он не последовательный и слишком разреженный.
Мне нужно дать каждому уникальному идентификатору пользователя идентификатор автоматического увеличения, чтобы отметить точку данных аналитики в битовом массиве / битовом наборе. Таким образом, первое взаимодействие с пользователем будет соответствовать первому биту битового массива, второй пользователь будет вторым битом в битовом массиве и т. Д.
Так есть ли надежный и быстрый способ генерировать инкрементные уникальные идентификаторы пользователя в MongoDB?
У меня была подобная проблема, а именно, я интересовался генерацией уникальных чисел, которые могут использоваться в качестве идентификаторов, но не имеют к. Я предложил следующее решение. Сначала инициализировать набор:
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
}
}
я полагаю, что идентификатору не связали слабые места с параллельной средой, от которой могут пострадать некоторые из других решений.