Объект «Коллекция» не может быть вызван.Если вы намеревались вызвать метод mapReduce для объекта Collection, то это будет сбой, поскольку такого метода не существует. - PullRequest
4 голосов
/ 06 августа 2011

Я использую pyMongo 1.11 и MongoDB 1.8.2. Я пытаюсь сделать довольно сложную карту / уменьшить. Я прототипировал функции в Mongo и заставил его работать, но когда я попытался перенести его в Python, я получил:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/Developer/R-and-D/<ipython-input-71-3c3a43221538> in <module>()
----> 1 results = db.user_actions.mapReduce(map, reduce, "user_entities_interactions")

/Library/Python/2.7/site-packages/pymongo/collection.pyc in __call__(self, *args, **kwargs)
   1099                         "call the '%s' method on a 'Collection' object it is "
   1100                         "failing because no such method exists." %
-> 1101                         self.__name.split(".")[-1])

TypeError: 'Collection' object is not callable. If you meant to call the 'mapReduce' method on a 'Collection' object it is failing because no such method exists.

Моя коллекция выглядит так:

{ "_id" : ObjectId("..."), "entity_id" : 1556, "user_id" : 466112 }
{ "_id" : ObjectId("..."), "entity_id" : 1366, "user_id" : 10057 }
{ "_id" : ObjectId("..."), "entity_id" : 234, "user_id" : 43650 }
{ "_id" : ObjectId("..."), "entity_id" : 6, "user_id" : 34430 }
{ "_id" : ObjectId("..."), "entity_id" : 461, "user_id" : 3416 }
{ "_id" : ObjectId("..."), "entity_id" : 994, "user_id" : 10057 }
{ "_id" : ObjectId("..."), "entity_id" : 296, "user_id" : 466112 }

Код, который я запускаю на Python:

map = Code("""function () {
        emit(this.user_id, { 
            user_id : this.user_id,
            entity_id : this.entity_id});
    }""")

reduce = Code("""function (key, values) {
        var entities = { user_id : values[0].user_id, entity_id : [ ] };
        for (var i = 0; i < values.length; i++) {
            entities.entity_id[i] = values[i].entity_id;
        }
        return entities;
    }""")
results = db.user_actions.mapReduce(map, reduce, "user_entities_interactions")

Как должен выглядеть :

{ "_id" : 3416, "value" : { "user_id" : 3416, "entity_id" : 461 } }
{ "_id" : 10057, "value" : { "user_id" : 10057, "entity_id" : [ 1366, 994 ] } }
{ "_id" : 34430, "value" : { "user_id" : 34430, "entity_id" : 6 } }
{ "_id" : 43650, "value" : { "user_id" : 43650, "entity_id" : 234 } }
{ "_id" : 466112, "value" : { "user_id" : 466112, "entity_id" : [ 1556, 296 ] } }

Мне не ясно, в чем проблема. Ошибка говорит о том, что у объекта 'Collection' нет метода mapReduce, но это явно не так, как работает пример на http://api.mongodb.org/python/current/examples/map_reduce.html и что такое «вещи», если не коллекция?

Кроме того, если вам интересно, почему я не делаю это с group (), это потому, что у меня более 20000 уникальных ключей .

Ответы [ 3 ]

5 голосов
/ 06 августа 2011

Это не называется mapReduce, но map_reduce.Попробуйте:

results = db.user_actions.map_reduce(map, reduce, "user_entities_interactions")
2 голосов
/ 06 мая 2015

Проблема

Как уже упоминалось во всех ответах, проблема в том, что метод MapReduce в pymongo фактически написан с подчеркиванием, то есть map_reduce ,чтобы соответствовать наиболее используемому стилю кода Python.

Непонятная ошибка

TypeError: 'Collection' object is not callable. If you meant to call the 'mapReduce' method on a 'Collection' object it is failing because no such method exists.

Ошибка может показаться очень запутанной и приведет вас в неправильном направлении.Дело в том, что MongoDB использует внутренние / системные имена коллекций, которые используют точка , например system.namespaces, system.indexes, system.profile и т. Д. Хотя MongoDB не позволяет использовать точка -едное имя для создания новой коллекции, в любом случае вы можете запросить существующие системные коллекции.Поэтому, пока вы запускаете ваш код user_actions.mapReduce, он фактически обрабатывает user_actions.mapReduce как одну коллекцию, т.е. экземпляр объекта Collection, а затем пытается выполнить метод __call__ для этого объекта, который не существует.Таким образом, ошибка.

Хорошая часть в том, что pymongo рассматривает этот случай и намекает на возможность того, что вы пытались выполнить метод mapReduce для соответствующего объекта Collection, который не существует.

0 голосов
/ 06 августа 2011

снова прочитайте эту связанную страницу, метод также называется map_reduce

, в этом примере things - это коллекция, она создается при вставке первого документа вэто.

...