是否可以在Mongo的MapReduce结果中重命名输出键?

时间:2013-06-08 04:11:13

标签: mongodb

我正在尝试使用pyMongo执行Inline mapreduce操作。

代码如下所示:

import pymongo
from bson.code import Code

con = pymongo.MongoClient()

map_func = Code("""
                function() {
                    var all = this.members.concat(this.admins)
                    var group_id = this._id
                    all.forEach(function(_id) {
                        emit(_id, [group_id])
                    })
                }
                """)

reduce_func = Code("""
                   function(key, values) {
                        var ob = {};
                        ob[key] = [];
                        for (var i=0; i<values.length; i++) {
                            ob[key].push(values[i][0])
                        }
                        return ob
                   }
                   """)

finalize_func = Code("""
                     function(key, value) {
                        if (typeof(value.push) == "function") {
                            return value
                        } else {
                            return value[key]
                        }
                     }
                     """)

result = con.test.group.inline_map_reduce(
    map_func,
    reduce_func,
    finalize=finalize_func)

import pprint; pprint.pprint(result)

此操作的输出为:

 [{u'_id': u'135348133252952338363702',
  u'value': [u'135457069105859781018098',
             u'135661481520484615218098',
             u'135391961249458761918098',
             u'135758863859275369318098',
             u'135156779012512657918098',
             u'135285081801846289218098',
             u'136040996346306049718098',
             u'136237587535011048218098',
             u'136862399436556328318098']},
 {u'_id': u'136068596781820946163702',
  u'value': [u'136068597966313224518098',
             u'135156779012512657918098',
             u'136415311739865096818098']}]

是否有任何钩子/运算符可用于将输出字段重命名为任何自定义字符串示例“group_id”而不是“values”?

我已阅读过Mongo的MapReduce文档,但没有找到有关如何实现此目的的任何提示。

2 个答案:

答案 0 :(得分:1)

不,减少的值始终位于名为value的字段中。

答案 1 :(得分:1)

使用描述here的MapReduce finalize挂钩,我将输出重新格式化为我想要的字段名称:

db.collection.mapReduce(
  mapFunction(),
  reduceFunction(),
  {
    query: {params},
    finalize: function(key, reduced_value) {
      return {
        my_field: key,
        my_value: reduced_value
      }
    }
  }
)