MongoDB中的异步并行管道聚合

时间:2018-07-18 18:15:19

标签: mongodb parallel-processing aggregate

我有一个聚合过程,该过程需要1个集合并针对其他几个集合使用$ lookup,以便创建一个新集合,该集合将其他集合(通过$ lookup)加入到特定字段中,从而将它们集合在一起。当前,我只有一个传递给db.collection.aggregate()的管道。但是,我将其视为一个串行过程:$ lookup 1,添加字段,$ lookup 2,添加字段等。有没有办法使它并行运行?例如,有4个进程同时运行管道聚合。我已经用python编写了代码,并使用了pymongo库。

当前管道的示例如下所示,其中查找了多个子表(这是从关系db迁移数据),然后将匹配数据作为父集合中的新文档字段输出。最后,整个聚合将作为新集合输出。

不是处理一个子集合,而是下一个,然后是下一个,是否有可能并行运行它们,以便在一个匹配项上有一个CPU进程起作用,而在另一个匹配项上又有另一个CPU进程起作用?

pipeline = [
{
    '$lookup':
        {
        'from': "child_collection1",
        'let': { 'o_id1': "$ID1", 'o_id2': "$ID2", 'o_id3':"$ID3", 'o_code':"$CODE" },
        'pipeline': [
            { '$match':
                { '$expr':
                    { '$and':
                    [
                        { '$eq': [ "$ID1",  "$$o_id1" ] },
                        { '$eq': [ "$ID2",  "$$o_id2" ] },
                        { '$eq': [ "$ID3",  "$$o_id3" ] },
                        { '$eq': [ "$CODE",  "$$o_code" ] }
                    ]
                    }
                }
            },
            { '$project': { 'CODE':0, 'ID1':0, 'ID2':0, 'ID3':0, '_id': 0 } }
        ],
        'as': "CHILD1"
        }
    },
    {
    '$lookup':
        {
        'from': "child_collection2",
        'let': { 'o_id1': "$ID1", 'o_id2': "$ID2", 'o_id3':"$ID3", 'o_code':"$CODE" },
        'pipeline': [
            { '$match':
                { '$expr':
                    { '$and':
                    [
                        { '$eq': [ "$ID1",  "$$o_id1" ] },
                        { '$eq': [ "$ID2",  "$$o_id2" ] },
                        { '$eq': [ "$ID3",  "$$o_id3" ] },
                        { '$eq': [ "$CODE",  "$$o_code" ] }
                    ]
                    }
                }
            },
            { '$project': { 'CODE':0, 'ID1':0, 'ID2':0, 'ID3':0, '_id': 0 } }
        ],
        'as': "CHILD2"
        }
    },
    { '$out': "new_collection"}

...
]

0 个答案:

没有答案
相关问题