Home

Tags

MongoDB map_reduce, подсчет количества

2010-05-27 mongodb map_reduce

В данном примере вычислим сумму значений атрибута col

# coding: utf8

from pymongo import Connection
from pymongo.code import Code

con = Connection()
con.drop_database('test')
db = con.test

db.posts.insert({ 'col':2 })
db.posts.insert({ 'col':3 })
db.posts.insert({ 'col':5 })

map = Code("emit('count', this.col);")

reduce = Code("function (key, vals) { "
    "var sum=0;"
    "for(var i in vals) sum += vals[i];"
    "return sum;"
    " }")

for x in db.posts.inline_map_reduce(map, reduce):
    print x
Результат
 {u'_id': u'count', u'value': 10.0}

Принцип действия

Создаем метод map, в котором вызываем emit(key,value) (ф-ия подстановки элементов)
 key='count' - это значит что результат вызова reduce должен будет поместиться в документ с идентификатором='count',
 value - указываем значение которое будет передаваться в reduce
Далее создаем метод reduce в котором будет производиться обработка данных и возврат результата

Примечание
В старой версии pymongo (<1.10), метода inline_map_reduce нет, вместо его нужно использовать map_reduce:
db.posts.map_reduce(map, reduce).find()