Я надеюсь получать случайную запись от огромного (100 миллионов записей) mongodb
.
Каков самый быстрый и самый эффективный способ сделать так? Данные уже там и нет никакого поля, в котором я могу генерировать случайное число и получить случайную строку.
Какие-либо предложения?
Это сложно, если нет данных, которые можно было бы отключить. что такое поле _id? это идентификаторы объекта mongodb? Если это так, вы можете получить максимальное и минимальное значения:
lowest = db.coll.find().sort({_id:1}).limit(1).next()._id;
highest = db.coll.find().sort({_id:-1}).limit(1).next()._id;
, тогда, если вы предполагаете, что идентификаторы распределены равномерно (но это не так, но, по крайней мере, это начало):
unsigned long long L = first_8_bytes_of(lowest)
unsigned long long H = first_8_bytes_of(highest)
V = (H - L) * random_from_0_to_1();
N = L + V;
oid = N concat random_4_bytes();
randomobj = db.coll.find({_id:{$gte:oid}}).limit(1);
Я бы предложил добавить случайное поле типа int к каждому объекту. Затем вы можете просто выполнить
findOne({random_field: {$gte: rand()}})
, чтобы выбрать случайный документ. Просто убедитесь, что вы гарантируетеIndex ({random_field: 1})
Выполните подсчет всех записей, сгенерируйте случайное число между 0 и подсчетом, а затем выполните:
db.yourCollection.find().limit(-1).skip(yourRandomNumber).next()