Как изменить структуру карты MongoDB - уменьшить результаты? - PullRequest
6 голосов
/ 07 декабря 2011

Когда я запускаю Map-Reduce в базе данных Mongo, я обычно получаю результаты, подобные следующим:

{ _id: <some-id>, value: { <first-key>: <first-value>, ... } }

Есть ли способ пропустить часть value: { ... } и напрямую вставить содержимое value в результат? По сути, я хотел бы получить результат, который выглядит следующим образом:

{ _id: <some-id>, <first-key>: <first-value>, ... }

Таким образом, я мог бы объединить результаты обратно в существующую коллекцию, которая подчиняется этому формату.

У меня также есть другой вопрос, касающийся Map-Reduce: возможно ли получить доступ к другой коллекции с помощью функции map или reduce?

Ответы [ 3 ]

6 голосов
/ 07 декабря 2011

MapReduce возвращает только документы в форме {_id: some_id, значение: some_value}

«some_value» не обязательно должно быть внедренным документом, но в большинстве случаев оно позволяет вычислять несколько переменных с помощью функции Map Reduce. Документы, возвращаемые функцией Reduce, должны быть в той же форме, в которой они введены, поскольку функция Reduce может запускаться повторно для любого заданного значения _id.

Пошаговое описание работы Map Reduce см. В разделе «Дополнительно» рецепта MongoDB Cookbook под названием «Поиск значений Max и Min с версионными документами» http://cookbook.mongodb.org/patterns/finding_max_and_min/ Это должно обеспечить лучшее понимание того, как работает Map Reduce, и почему выходные данные должны быть в формате {_id: some_id, value: some_value}

Можно сделать инкрементное уменьшение карты, которое объединит результаты нескольких функций уменьшения карты. http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-IncrementalMapreduce

Наконец, в настоящее время невозможно получить доступ к нескольким коллекциям одновременно с помощью Map Reduce. Для этой возможности имеется запрос на добавление функции, но ее не планируется добавлять в какие-либо будущие версии.
https://jira.mongodb.org/browse/SERVER-970

0 голосов
/ 22 ноября 2012

RE: Доступ к другим коллекциям из функций Map / Reduce. То, что вы можете сделать, это использовать «область» для добавления данных, необходимых m / r во время выполнения. ПРИМЕЧАНИЕ: область действия принимает только ПРОСТУЮ коллекцию объектов здесь. Под простыми я имею в виду отсутствие вложенных документов.

scope = { People : [{ Name : 'bob', Color : 'blue'}, { Name : 'sally', Color: 'orange'}] }

Приведенный выше набор областей работает нормально. В функции m / r просто обращайтесь к «Людям» как к глобальной переменной, и вы можете перебирать свою коллекцию и т. Д.

scope = { People : [{ Name : 'bob', Color : { Favorite : 'blue'} }, { Name : 'sally', Color : { Favorite : 'orange' } }] }

Выше не будет работать, в зависимости от используемого вами драйвера вы получите сообщение об ошибке диапазона и сообщите, что максимальный размер вызова превышен или что-то в этом роде. Придерживаясь простых объектов в области видимости, жизнь будет простой.

0 голосов
/ 07 декабря 2011

Это сработало для меня:
Предполагая, что вы излучаете this или его вариацию на карте, сначала установите this._id = undefined.
Установить режим слияния.

Посмотрите мой пример здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...