3

我正在尝试使用 pyMongo 执行内联 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 文档,但没有找到有关如何完成此操作的任何提示。

4

2 回答 2

2

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

db.collection.mapReduce(
  mapFunction(),
  reduceFunction(),
  {
    query: {params},
    finalize: function(key, reduced_value) {
      return {
        my_field: key,
        my_value: reduced_value
      }
    }
  }
)
于 2015-02-07T00:36:39.293 回答
1

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

于 2013-06-11T19:47:18.670 回答