Кажется, что нет простого способа преобразовать ObjectId
в long для выполнения операции по модулю.В качестве альтернативы вы можете распределить обработку, используя простое сравнение строк для последнего символа _id
или нескольких последних символов, если вам нужно больше потоков,
Например, если вы хотите запустить обработку с использованием процессов 4
, вы можете попробоватьследующие запросы:
db.col.aggregate([ { $match: { $expr: { $in: [ { $substr: [ { $toString: "$_id" }, 23, 1 ] }, [ "0", "1", "2", "3" ] ] } } } ])
...
db.col.aggregate([ { $match: { $expr: { $in: [ { $substr: [ { $toString: "$_id" }, 23, 1 ] }, [ "c", "d", "e", "f" ] ] } } } ])
Это может масштабироваться до большего числа процессов, если вам нужно больше, чем 16
, просто берите последние два символа, например:
db.col.aggregate([ { $match: { $expr: { $in: [ { $substr: [ { $toString: "$_id" }, 22, 2 ] }, [ "00", "01" ] ] } } } ])
Загрузка должна быть распределенаболее или менее равномерно, поскольку последние три символа представляют
3-байтовый счетчик, начиная со случайного значения.