как сортировать документы используя карту эрланга - PullRequest
2 голосов
/ 21 ноября 2010

Я сейчас использую riak для хранения документов json, и я хочу отсортировать их по некоторому атрибуту, скажем, есть ключ, например:

{"someAttribute": "независимо от того", "порядок": 1}

, поэтому я хочу отсортировать документы по" порядку ".

В настоящее время я получаю документы в риаке с помощью интерфейса erlang.я могу получить документ обратно в виде строки, но я не знаю, что делать после этого.я думаю, что функция карты просто уменьшает сам документ json, а в функции сокращения я бы проверил, имеет ли элемент, на который я смотрю, более высокий «порядок», чем глава остальной частиlist, и если да, добавьте начало, а затем верните list: reverse.

, несмотря на мои идеи выше, у меня был нулевой результат почти за целый день, я так запутался с интерфейсом erlang в riak,Может ли кто-нибудь дать представление о том, как написать эту функцию map / Reduce, или просто как проанализировать документ json?

Ответы [ 3 ]

1 голос
/ 21 ноября 2010

Насколько я знаю, у вас нет доступа к списку ввода на карте. Вы излучаете из карты документ как 1 элемент списка.

Входные данные (все документы для обработки как {Bucket, Key}) -> Карта (обрабатывать один документ) -> Уменьшить (весь список генерируется из карты).

Карты выполняются для каждого документа на многих узлах, тогда как уменьшение выполняется один раз на так называемом координатном узле (тот, где был вызван запрос).

Решение:

  1. Определить входы (в виде списка или группы)
  2. Получить значение на карте и выдать весь документ или {Id, Val_to_sort_by)
  3. Сортировка по уменьшению (используя обычный список: сортировка ключей)
0 голосов
/ 22 ноября 2010

, поэтому я "решил" проблему с помощью JavaScript, но до сих пор не могу сделать это с помощью Erlang.вот мой запрос

{"inputs":"test",
 "query":[{"map":{"language":"javascript",
                  "source":"function(value, keyData, arg){ var data = Riak.mapValuesJson(value)[0]; var obj = {}; obj[data.order] = data; return [ obj ];}"}},
         {"reduce":{"language":"javascript",
                    "source":"function(values, arg){ return [ values.reduce(function(acc, item){ for(var order in item){ acc[order] = item[order]; } return acc;  }) ];}",
                    "keep":true}}
         ]
}

, поэтому на этапе отображения все, что я делаю, - это создаю новый массив obj с ключом в качестве порядка и значением в качестве самих данных.Итак, визуально, объект obj похож на

{"1":{"firstName":"John","order":1}

в фазе сокращения, я просто помещаю его в аккумулятор, так что, по сути, это то, что вы думаете об этом, потому что, когда вы закончите,все будет в порядке для вас.поэтому я поставил 2 json-документа для тестирования, один из них выше, остальное просто firstName: Billie, order 2. и вот мой результат для запроса выше

[{"1":{"firstName":"John","order":1},"2":{"firstName":"Billie","order":2}}]

, так что он работает!,но мне все еще нужно сделать это в ERLANG, есть идеи?

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

Это не решение для уменьшения карты, но вы должны проверить Riak Search .

...