我收集了数以百万计的文档,如下所示:
{
customerId: "12345" // string of numbers
foo: "xyz"
}
我想读取集合中的每个文档,并将每个文档中的数据用于大型批处理作业。每个客户都是独立的,但是1个客户可能有多个文档,必须一起处理。
我想将工作分解为N个单独的查询,即N个任务(如果N> M,则可以分布在M个客户端上)。
每个查询如何有效地考虑不同的互斥客户群?
一种方法可能是任务1查询所有ID以“ 1”开头的客户; task2查询所有文档,以查找所有ID以“ 2”等开头的所有客户,以此类推-给出N = 10,最多可扩展到10个客户。不确定通过子字符串查询是否很快。有更好的方法吗?
答案 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