Карта Mongodb уменьшить через 2 коллекции - PullRequest
2 голосов
/ 01 ноября 2011

Допустим, у нас есть пользователь и коллекция постов.В коллекции постов голосуйте, сохраняя имя пользователя в качестве ключа.

db.user.insert({name:'a', age:12});
db.user.insert({name:'b', age:12});
db.user.insert({name:'c', age:22});
db.user.insert({name:'d', age:22});

db.post.insert({Title:'Title1', vote:[a]});
db.post.insert({Title:'Title2', vote:[a,b]});
db.post.insert({Title:'Title3', vote:[a,b,c]});
db.post.insert({Title:'Title4', vote:[a,b,c,d]});

Мы хотели бы сгруппировать по посту. Название и узнать количество голосов в разных возрастах пользователей.

Я искал и не могу найти доступ к коллекции 2 в mongodb mapreduce.Может ли быть возможно добиться повторного сокращения?

Я знаю, что встроить пользовательский документ в публикацию намного проще, но это не очень хороший способ, поскольку у настоящего пользовательского документа много свойств.Если мы включим упрощенную версию пользовательского документа, это ограничит размер анализа.

{Title:'Title1', vote:[{name:'a', age:12}]}

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

MongoDB не имеет нескольких коллекций Map / Reduce. MongoDB не имеет синтаксиса JOIN и может быть не очень хорош для специальных соединений. Вам нужно будет каким-то образом денормализовать эти данные.

У вас есть несколько вариантов:

Вариант № 1: Добавить возраст с голосованием.

{Title:'Title1', vote:[{name:'a', age:12}]}

Вариант № 2: вести счетчик возрастов

{Title:'Title1', vote:[a, b], age: { "12" : 1, "22" : 1 }}

Вариант № 3: Выполнить "ручное" соединение

Ваш последний вариант - написать скрипт / код, который выполняет цикл for для обеих коллекций и корректно объединяет данные.

Таким образом, вы бы перебрали post и вывели коллекцию с заголовком и списком голосов. Затем вы просматриваете новую коллекцию и обновляете возраст, просматривая каждый user.

Мое предложение

Перейти с № 1 или № 2.

0 голосов
/ 02 ноября 2011

Вместо

{name:'a', age:12}

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

{name:'a', age:12, voteTitle:["Title1","Title2","Title3","Title4"]}
...