Mongo-将1个查询拆分为N个查询

时间:2020-01-22 17:44:04

标签: mongodb mongodb-query

我收集了数以百万计的文档,如下所示:

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

我想读取集合中的每个文档,并将每个文档中的数据用于大型批处理作业。每个客户都是独立的,但是1个客户可能有多个文档,必须一起处理。

我想将工作分解为N个单独的查询,即N个任务(如果N> M,则可以分布在M个客户端上)。

每个查询如何有效地考虑不同的互斥客户群?

一种方法可能是任务1查询所有ID以“ 1”开头的客户; task2查询所有文档,以查找所有ID以“ 2”等开头的所有客户,以此类推-给出N = 10,最多可扩展到10个客户。不确定通过子字符串查询是否很快。有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用$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
}

可跟踪性

您怎么知道工作是否完成?工作卡在哪里?

完成作业后,添加其他字段:

jobId     - You can know what task processed this data
startDate - When did data processing started
endDate   - When did data processing finished