将MongoDB聚合管道代码从Javascript转换为Python

时间:2017-09-14 18:01:56

标签: python mongodb aggregation-framework

作为Python / MongoDB / pymongo的新手,我使用Studio 3T生成一个工作聚合管道,用于访问和处理mongoDB集合的内容。我可以看到它在那里完美地工作并输出预期的结果。问题是Studio 3T为代码生成了一个.js文件,而我需要在包装器中用Python编写代码。

代码在Studio 3T上正确执行:

db.cln_matching_results.aggregate(

// Pipeline
[
    // Stage 1
    {
        $unwind: {
            path : '$_availability',
            includeArrayIndex : 'arrayIndex', // optional
            preserveNullAndEmptyArrays : false // optional
        }
    },

    // Stage 2
    {
        $unwind: {
            path : '$_availability.availability_data',
            includeArrayIndex : 'arrayIndex', // optional
            preserveNullAndEmptyArrays : false // optional
        }
    },

    // Stage 3
    {
        $match: {
            '_availability.availability_data.start_date': {$gte: "2017-09-14T00:00:00.000Z", $lte: "2017-09-31T00:00:00.000Z"}
        }
    },

    // Stage 4
    {
        $group: {
                   _id : '$_id',
                   MD_offered_max: { $sum: { $divide: [ "$_availability.availability_data.value", 100 ] } }
        }
    },
]);

我尝试在Python包装器中复制工作代码会破坏管道并在执行后提供一个空数组。我强调,当我注释掉下面的代码时,其余的python代码完全正常:

    test_pipeline.extend([
    {"$unwind": {'path': '$_availability', 'preserveNullAndEmptyArrays': False}},
    {"$unwind": {'path': '$_availability.availability_data', 'preserveNullAndEmptyArrays': False}},
    {'$match': {'$_availability.availability_data.start_date': {'$gte': "2017-09-14T00:00:00.000Z", '$lte': "2017-09-16T00:00:00.000Z"}}},
    {'$group':{'_id' : '$_id', 'MD_offered_max': { '$sum': { '$divide': [ "$_availability.availability_data.value", 100 ] } }}},
    {'$addFields': {'availability_scoring': '$MD_offered_max'}}
])

我的问题是:在尝试将代码从.js格式转换为Python时,我在哪里出错了?谢谢你的帮助。

0 个答案:

没有答案