2012-01-27 24 views
5

Jestem nowym użytkownikiem CouchDB i ogólnie zorientowanych na dokumenty baz danych.Identyfikacja duplikatów w CouchDB

Bawiłem się z CouchDB i byłem w stanie zapoznać się z tworzeniem dokumentów (z perl) i używając funkcji Map/Reduce w Futon do wysyłania zapytań o dane i tworzenia widoków.

Jedną z rzeczy, które wciąż próbuję wymyślić jest, jak zidentyfikować zduplikowane wartości w dokumentach za pomocą mapy Futona/Zmniejsz.

Na przykład, jeśli mam następujące dokumenty:

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

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

I chciałem uzyskać listę identyfikatora dokumentu, który miał duplikat wartości „nazwa”, jest to coś, co mógłbym zrobić z Futon Mapa/Zmniejszyć?

Wynik był nadzieją, aby osiągnąć to, co następuje:

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

..or ..

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

.. co byłoby wartość, a skojarzone identyfikatory dokumentów, które zawierają te zduplikowane wartości .

Próbowałem kilku różnych rzeczy z mapą/zmniejszeniem, ale o ile rozumiem, funkcja mapy działa z danymi na podstawie dokumentu, a funkcja zmniejszania pozwala tylko na pracę z kluczami/wartości z danego dokumentu.

Wiem, że mogłem po prostu wyciągnąć potrzebne dane za pomocą perla, pracować magicznie i uzyskać pożądany wynik, ale staram się pracować teraz tylko z CouchDB, aby lepiej zrozumieć jego zalety/ograniczenia.

Innym sposobem, myślę o zrobieniu tego jest użycie pojedynczego dokumentu jak stół 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" 
    } 
} 

.. co powinno pozwolić mi korzystać z Map/Reduce funkcje w sposób, jaki pierwotnie sądzono . Jednak nie jestem pewien, czy to jest idealne.

Rozumiem, że mój umysł wciąż tkwi w ziemi RDBMS, więc wiele z tego, co próbuję zrobić powyżej, może nie być konieczne. Wszelkie spostrzeżenia na ten temat byłyby mile widziane.

Dzięki!

Edycja: Naprawiono składnię JSON w niektórych przykładach.

Odpowiedz

7

Jeśli chcesz tylko listę unikatowych wartości, to całkiem proste. Jeśli chcesz zidentyfikować duplikaty, staje się to mniej łatwe.

W obu przypadkach funkcja map jak to powinno wystarczyć:

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

Dla funkcji ograniczenia, wpisz _count.

Twój wyjście widok będzie wyglądać następująco: (na podstawie dokumentów 2)

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

Stamtąd będziesz miał listę nazwisk, jak również ich częstotliwość.Możesz wziąć tę listę i odfiltrować ją samodzielnie, lub możesz wziąć trasę "całej kanapy" i użyć _list function do wykonania końcowego filtrowania.

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

Przeczytaj o funkcjach _list, są one bardzo poręczne i wszechstronne.

+0

... i dla uzyskania duplikatów: ? Skip = 1 & reduce = false & key = "car1" –