【问题标题】:Optimize a Mongodb query优化 MongoDB 查询
【发布时间】:2015-09-22 07:03:55
【问题描述】:
db.runCommand({
    'mapreduce': 'rtb_ymantnt_xyz',
    'map': 'function() { var band_size = 0.5; var cscsm_id = this.cscsm_id;var site_id =this.entity_id;var tld=this.domain_id;
    this.xyz.forEach(function(h) {
        var converted_sum_cpm = h.sum_cpm;
        var bin_start = Math.floor(converted_sum_cpm / h.bin_volume / band_size) * band_size;
        emit({
            site_id: site_id,
            tld: tld,
            bin: bin_start
        }, {
            sum_cpm: h.sum_cpm,
            bin_volume: h.bin_volume,
            band_size: band_size
        })
    })
    }
    ',
    'reduce': 'function(key, values) { var result = {sum_cpm : 0, bin_volume : 0 , band_size : 0};
    values.forEach(function(value) {
    result.sum_cpm += value.sum_cpm;
    result.bin_volume += value.bin_volume;
    result.band_size = value.band_size;
    });
    return result;
}
',
'verbose': true,
'query': {
    'entity_reference_id': 43568,
    'date': {
    '$gte': '2015-06-15',
    '$lte': '2015-06-15'
    },
    'entity_type': 1,
    'domain_id': {
    '$ne': -1
    },
    'cscsm_id': {
    '$ne': -1
    },
    'bid_type': 1
},
'out': {
    'replace': 'xyz_debug_anmsyo'
}
})

db.xyz_debug_anmsyo.find().forEach(function(x) {
    print(x._id.site_id + "," + x._id.tld + "," + x._id.bin + "," + x.value.bin_volume + "," + x.value.sum_cpm)
})

有人可以建议优化这个 mongo 查询吗?

【问题讨论】:

    标签: mongodb mapreduce mongodb-query aggregation-framework


    【解决方案1】:

    您可以从使用.aggregate() 方法开始,而不是当前的mapReduce。聚合管道代码是原生编码的,不需要 JavaScript 翻译开销或任何文档转换即可在 JavaScript 中工作。

    您在这里并没有做任何特别的事情,只是一个查询条件,然后处理每个文档中数组的每个元素,以对公共键进行分组并总结值。为此有一个直接的翻译:

        db.rtb_ymantnt_xyz.aggregate([
            { "$match": {
                "entity_reference_id": 43568,
                "date": "2015-06-15",
                "entity_type": 1,
                "domain_id": { "$ne": -1 },
                "cscsm_id": { "$ne": -1  },
                "bid_type": 1
            }},
            { "$unwind": "$xyz" },
            { "$group": {
                "_id": {
                    "site_id": "$entity_id",
                    "tld": "$domain_id",
                    "bin": {
                        "$multiply": [
                            { "$subtract": [
                                { "$divide": [
                                    "$xyz.sum_cpm",
                                    "$xyz.bin_volume",
                                    0.5
                                ]},
                                { "$mod": [
                                    { "$divide": [
                                        "$xyz.sum_cpm",
                                        "$xyz.bin_volume",
                                        0.5
                                    ]},
                                    1
                                ]}
                            ]},
                            0.5
                        ]
                    }
                },
                "sum_cpm": { "$sum": "$xyz.sum_cpm" },
                "bin_volume": { "$sum": "$xyz.bin_volume" },
                "band_size": { "$last": { "$literal": 0.5 } }
            }}
        ])
    

    还请注意,在查询中,当您只查看单个日期时,对“字符串日期”使用“范围”表达式几乎没有意义。考虑转换为 BSON Date,因为它具有更大的灵活性,而且它通常比使用字符串存储更紧凑。

    除此之外,然后添加索引。并且主要在您指定“精确值”的字段上:

                "entity_reference_id": 43568,
                "date": "2015-06-15",
                "entity_type": 1,
                "bid_type": 1
    

    字段的顺序非常重要,因为您通常应该首先列出将最大程度地减少可能匹配的字段,并且以这种方式编写查询条件也很好。所以希望像entity_reference_id 这样的字段,然后在逻辑上date 将主要过滤结果,并应按该顺序编制索引。如果其他字段不是主要过滤器,则它们是可选的,但它们确实有帮助。

    索引可加快查询速度,尤其是在字段顺序补充过滤过程时。自然会产生额外的写入成本和存储成本,但如果您想要更快并承担一些引擎负载,那么您应该拥有它们。

    如果必须,那么还有 $out 聚合管道阶段可以改为写入集合。但就像使用 mapReduce 一样,除非您的输出大小特别大,否则您不应该真正这样做。并且不要忘记,在现代 MongoDB 中,.aggregate() 可以返回一个游标,与“内联”mapReduce 不同,它可以迭代结果以节省将整个结果加载到内存中。

    【讨论】:

      猜你喜欢
      • 2015-01-21
      • 2015-01-09
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 2021-09-03
      • 2019-10-25
      • 2020-07-05
      相关资源
      最近更新 更多