2012-01-27 11 views
5

Soy nuevo en CouchDB y en las bases de datos orientadas a documentos en general.Identificación de duplicados en CouchDB

He estado jugando con CouchDB, y pude familiarizarme con la creación de documentos (con perl) y el uso de las funciones de Mapa/Reducción en Futon para consultar los datos y crear vistas.

Una de las cosas que aún estoy tratando de descifrar es cómo identificar los valores duplicados en todos los documentos usando Futon's Map/Reduce.

Por ejemplo, si tengo los siguientes documentos:

{ 
    "_id": "123", 
    "name": "carl", 
    "timestamp": "2012-01-27T17:06:03Z" 
} 

{ 
    "_id": "124", 
    "name": "carl", 
    "timestamp": "2012-01-27T17:07:03Z" 
} 

Y quería obtener una lista de identificadores de documentos que tenía duplicar los valores de "nombre", esto es algo que podría hacer con el futón en un mapa/¿Reducir?

El resultado se espera lograr es el siguiente:

{ 
    "name": "carl", 
    "dupes": [ "123", "124" ] 
} 

..o ..

{ 
    "carl": [ "123", "124" ] 
} 

.. lo que sería el valor, y la ID de los documentos asociados que contienen esos valores duplicados .

He intentado algunas cosas diferentes con Map/Reduce, pero por lo que yo entiendo, la función Map funciona con los datos por documento, y las funciones Reduce solo le permiten trabajar con las teclas/valores de un documento dado.

Sé que podría extraer los datos que necesito con Perl, trabajar con magia allí y obtener el resultado que quiero, pero estoy tratando de trabajar solo con CouchDB por ahora para comprender mejor sus ventajas/limitaciones.

Otra forma en que estoy pensando en hacer esto es utilizar un solo documento como una tabla RDBMS:

{ 
    "_id": "names", 
    "rec1": { 
    "_id": "123", 
    "name": "carl", 
    "timestamp": "2012-01-27T17:06:03Z" 
    }, 
    "rec2": { 
    "_id": "124", 
    "name": "carl", 
    "timestamp": "2012-01-27T17:07:03Z" 
    } 
} 

.. que debería permitir que use el map/reduce funciones en la forma en que se pensaba originalmente . Sin embargo, no estoy seguro de si esto es ideal.

Entiendo que mi mente todavía está atrapada en tierra RDBMS, por lo que gran parte de lo que trato de hacer arriba puede no ser necesario. Cualquier idea sobre esto sería muy apreciada.

Gracias!

Editar: Se corrigió la sintaxis de JSON en algunos de los ejemplos.

Respuesta

7

Si simplemente desea una lista de valores únicos, eso es bastante fácil. Si desea identificar los duplicados, entonces es menos fácil.

En ambos casos, una función de mapa como éste debería ser suficiente:

function (doc) { 
    emit(doc.name); 
} 

Para su función de reducir, basta con introducir _count.

Su salida de la vista se verá así: (basado en sus documentos 2)

{ 
    "rows": [ 
     { "key": "carl", "value": 2 } 
    ] 
} 

A partir de ahí, tendrá una lista de nombres, así como su frecuencia.Puede tomar esa lista y filtrarla usted mismo, o puede tomar la ruta "all couch" y usar un _list function para realizar ese filtrado final.

function (head, req) { 
    var row, duplicates = []; 
    while (row = getRow()) { 
     if (row.value > 1) { 
      duplicates.push(row); 
     } 
    } 
    send(JSON.stringify(duplicates)); 
} 

leer acerca de _list funciones, que son bastante práctico y versátil.

+0

... y para obtener identificadores duplicados: ? Skip = 1 & reduce = false & key = "car1" –