Комбинируете ли вы данные из двух разных источников данных, совершаете ли вы несколько покупок у одного и того же клиента или просто вводите одни и те же данные в веб-форму дважды, похоже, что в тот или иной момент все сталкиваются с проблемой дублирования данных.
В этом сообщении мы рассмотрим использование представлений в 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 являются дубликатами документов.
Как показано на рисунке ниже, дубликаты документов теперь удаляются.
Наслаждайтесь!

