Комбинируете ли вы данные из двух разных источников данных, совершаете ли вы несколько покупок у одного и того же клиента или просто вводите одни и те же данные в веб-форму дважды, похоже, что в тот или иной момент все сталкиваются с проблемой дублирования данных.
В этом сообщении мы рассмотрим использование представлений в Couchbase Server 2.0 для поиска подходящих полей среди документов и сохранения неповторяющихся документов. В этом примере предположим, что в каждом документе есть три общих поля, указанных пользователем — first_name , last_name , postal_code . Используя клиент ruby для Couchbase Server и фейкерный ruby gem, вы можете создать простой генератор данных для загрузки образцов дубликатов данных в Couchbase. Чтобы использовать ruby в качестве языка программирования с Couchbase, вы должны загрузить Ruby SDK здесь .
Вот пример выполнения:
$ ruby ./generate.rb --help Usage: generate.rb [options] -h, --hostname HOSTNAME Hostname to connect to (default: 127.0.0.1:8091) -u, --user USERNAME Username to log with (default: none) -p, --passwd PASSWORD Password to log with (default: none) -b, --bucket NAME Name of the bucket to connect to (default: default) -t, --total-records NUM The total number of the records to generate (default: 10000) -d, --duplicate-rate NUM Each NUM-th record will be duplicate (default: 30) -?, --help Show this message $ ruby ./generate.rb -t 1000 -d 5 1000 / 1000
meta.id
в функции map представления. На рисунке 1 ниже, есть несколько документов, загруженных на Couchbase Server с использованием клиента генератора данных выше.
Шаг 1
function (doc, meta) { emit([doc.first_name + '-' + doc.last_name + '-' + doc.postal_code], meta.id); }
Шаг 2
Функция уменьшения выглядит как —
function (keys, values, rereduce) { if (rereduce) { var res = []; for (var i = 0; i < values.length; i++){ res = res.concat(values[i]) } return res; } else { return values; } }
После группировки, если имеется несколько значений meta.id, мы объединяем их, чтобы получить список ссылок meta.id на дубликат документа.
Шаг 3
require 'couchbase' connection = Couchbase.connect(options) ddoc = connection.design_docs[options[:design_document]] view = ddoc.send(options[:view]) connection.run do view.each(:group => true) do |doc| dup_num = doc.value.size if dup_num > 1 puts "left doc #{doc.value[0]}, " # delete documents from second to last connection.delete(doc.value[1..-1]) puts "removed #{dup_num} duplicate(s)" end end end
Если число meta.id в массиве значений больше 2, существуют дубликаты документов, соответствующие этому ключу. Как показано на рисунке выше, id19 и id20 являются дубликатами документов.
Как показано на рисунке ниже, дубликаты документов теперь удаляются.
Наслаждайтесь!