Tanto si está combinando datos de dos fuentes de datos diferentes, como si tiene varias compras de un mismo cliente o acaba de introducir dos veces los mismos datos en un formulario web, parece que todo el mundo se enfrenta al problema de los datos duplicados en un momento u otro.
En esta entrada del blog, veremos cómo utilizar vistas en Couchbase Server 2.0 para encontrar campos coincidentes entre documentos y retener los documentos no duplicados. Por el bien de este ejemplo, supongamos que cada documento tiene tres campos comunes especificados por el usuario - nombre, apellido, código_postal. Utilización de la cliente ruby para Couchbase Server y el farsante ruby gem, puedes construir un sencillo generador de datos para cargar algunos datos duplicados de ejemplo en Couchbase. Para utilizar ruby como lenguaje de programación con Couchbase, debes descargar el SDK de Ruby aquí.
He aquí un ejemplo de ejecución:
$ ruby ./generate.rb -help
-h, -nombrehost NOMBREHOST Nombre de host al que conectarse (por defecto: 127.0.0.1:8091)
-u, -usuario USERNAME Nombre de usuario para iniciar sesión (por defecto: ninguno)
-p, -passwd CONTRASEÑA Contraseña para iniciar sesión (por defecto: ninguna)
-b, -nombre del cubo Nombre del bucket al que conectarse (por defecto: default)
-t, -total-registros NUM El número total de registros a generar (por defecto: 10000)
-d, -duplicate-rate NUM Cada registro NUM-th será duplicado (por defecto: 30)
-?, -help Mostrar este mensaje
$ ruby ./generate.rb -t 1000 -d 5
1000 / 1000

Primer paso
function (doc, meta) {
emit([doc.first_name + '-' + doc.last_name + '-' + doc.postal_code], meta.id);
}
La función de mapa define cuándo dos documentos son duplicados. Según la función map definida anteriormente, dos documentos son duplicados cuando el nombre, el apellido y el código postal coinciden. Utilizamos '-' para evitar el aliasing de los datos al concatenar el nombre, el apellido y el código postal.
Paso 2
La función reduce tiene el siguiente aspecto -
function (keys, values, rereduce) {
var res = [];
for (var i = 0; i < valores.longitud; i++){
res = res.concat(valores[i])
}
devolver res;
} else {
valores de retorno;
}
}
Tras la agrupación, si hay más de un valor meta.id, los concatenamos para obtener una lista de meta.id que hagan referencia a un documento duplicado.
Paso 3
Si el número de meta.id en la matriz de valores es superior a 2, hay documentos duplicados correspondientes a esa clave. Como se muestra en la figura anterior, id19 e id20 son documentos duplicados.


Me da un error de "Reducción demasiado grande".
Cuando elimino el trozo de código de reducción, el error desaparece. Pero supongo que necesito ese código de reducción...
¿Es posible hacer esto en N1QL? Debería ser más rápido que desde el cliente.
Sí, sin duda sería posible hacer algo similar con N1QL en 4.0 y posteriores. Este blog fue escrito originalmente para 2.0. Dicho esto, Couchbase se despliega como un sistema distribuido, por lo que un procedimiento N1QL ejecutándose actuaría igual que lo haría un cliente. Realmente es un cliente para los datos subyacentes. Obtienes un beneficio en algunos casos ejecutando el servicio de consulta co-localizado con los datos, pero ciertamente puedes hacer eso con otros programas también.