Все примеры MongoDB MapReduce, которые я видел, касались подсчета/добавления чисел. Мне нужно комбинировать строки, и похоже, что MapReduce - лучший инструмент для работы. У меня большая коллекция MongoDB в таком формате:Mongodb MapReduce для конкатенации строк?
{name: userone, type: typeone}
{name: usertwo, type: typetwo}
{name: userthree, type: typeone}
Каждое имя имеет только один тип, но имена необязательно уникальны. Я хочу, чтобы в конечном итоге с коллекцией, в котором перечислены все имена для определенного типа, либо в список через запятую или массив, например:
{type: typeone, names: userone, usertwo}
{type: typetwo, names: userthree}
Я пытался использовать MapReduce для достижения этой цели. Моя функция работает правильно, когда есть только один пользователь для типа. Однако, когда пользователей более одного пользователя, «неопределенный» хранится в поле имен.
Я не очень хорошо разбираюсь в Javascript, и я все еще изучаю MongoDB, поэтому это, вероятно, простой тип данных или ошибка области.
Вот моя карта и функции сокращения. Что с ними не так?
map = function() {
emit(this.user,{type:this.type});
}
reduce = function(key, values) {
var all="";
for(var i in values) {
all+=values[i]['type']+",";
}
return all;
}
Это прекрасно работает ... теперь, как бы изменить этот код, чтобы иметь имена в массиве вместо списка, разделенного запятыми (тогда я могу построить список на запятой на клиенте, если это необходимо)? Просто положить взамен {"names": all}; ( [0] => Массив ( [0] => Массив ( [0] => Массив ( [0]) [0] => Массив ( [0] => Массив ( [0] => => Array ( [0] => Array ( –
Ahh ... да. Я не был уверен, каковы ваши намерения, поэтому я догадался, основываясь на вашем коде. Я изменю свой ответ, чтобы включить пример массива. –