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

3
我将尝试使用pyMongo执行内联mapreduce操作。
代码如下:
```python ```
```python ```
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个回答

2

使用MapReduce finalize钩子,如此处所述,我重新格式化输出为我想要的字段名称:

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

这个接近所请求的操作,但返回的对象仍然在一个值字段下。 - inolasco

1
不,缩减后的值始终在名为value的字段中。

谢谢。有没有可能很快考虑这样的功能? - meson10
1
我们已经讨论了一个功能,可以让您更好地控制mapreduce输出,您可以在这里投票支持它:https://jira.mongodb.org/browse/SERVER-2517。与任何功能一样,我们必须权衡其有用性和增加的复杂性。 - A. Jesse Jiryu Davis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接