Пн go - разбить 1 запрос на N запросов - PullRequest
0 голосов
/ 22 января 2020

У меня есть коллекция миллионов документов следующим образом:

{
  customerId: "12345" // string of numbers
  foo: "xyz" 
}

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

Я хотел бы разделить работу на N отдельных запросов, то есть N задач (которые могут быть распределены по M клиентам, если N> M ).

Как каждый запрос может эффективно учитывать различные исключительные и смежные наборы клиентов?

Один из способов может заключаться в том, чтобы задача 1 опрашивала всех клиентов, чьи идентификаторы начинаются с " 1" ; Задача 2 - запросить все документы для всех клиентов, чьи идентификаторы начинаются с "2" и c, что дает N = 10, который можно распространить на 10 клиентов. Не уверен, что запрос по подстроке быстрый, хотя. Есть ли лучший метод?

1 Ответ

0 голосов
/ 22 января 2020

Вы можете использовать $skip / $limit операторы для разделения ваших данных на отдельные запросы.

Псевдокод

I assume MongoDB driver automatically generates an ObjectId for the _id field

var N = 10;
var M = db.collection.count({});

// We calculate how many tasks we should execute
var tasks = M / N + (M % N > 0 ? 1 : 0);

//Iterate over tasks to get fixed amount data for each job
for (var i = 0; i < tasks; i++) {
    var batch = db.collection.aggregate([
        { $sort  : { _id : 1 } },
        { $skip  : i },
        { $limit : N },
        //Use $lookup "multiple docs"
    ]).toArray();

    //i=0 data:  0 - 10
    //i=1 data: 11 - 20
    //i=2 data: 21 - 30
    ...
    //i=100 data: 1000 - 1010
    //Note: If there are no enough N results, MongoDB will return 0 ... N records

    // Process batch here
}

Отслеживаемость

Как узнать, что работа закончена или нет? Где застряло задание?

Добавьте дополнительные поля после завершения sh выполнения задания:

jobId     - You can know what task processed this data
startDate - When did data processing started
endDate   - When did data processing finished
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...