2012-01-27 41 views
5

我是CouchDB和麪向文檔的數據庫的新手。在CouchDB中識別重複項

我一直在玩CouchDB,並且能夠熟悉創建文檔(使用perl)並使用蒲團中的Map/Reduce功能來查詢數據並創建視圖。

我仍然試圖弄清楚的一件事是如何使用Futon的Map/Reduce來識別跨文檔的重複值。

舉例來說,如果我有以下文件:

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

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

,我想獲得的是有重複的「名稱」值文檔ID的列表,這事我會用被褥地圖做/減少?

結果希望實現如下:

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

..或者..

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

..這將是的值,和相關聯的文檔ID,其包含這些重複的值。

我已經嘗試了一些與Map/Reduce不同的東西,但據我瞭解,Map函數在每個文檔的基礎上處理數據,而Reduce函數只允許您使用鍵/來自給定文檔的值。

我知道我可以將我需要的數據用perl在那裏工作,並獲得我想要的結果,但我現在只想用CouchDB工作,以便更好地理解它的優點/限制。

另一種方式,我想這樣做是使用一個單一的文件就像一個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" 
    } 
} 

..這應該允許我使用Map /在我原本以爲的方式Reduce函數。但我不確定這是否理想。

我知道我的思想還停留在RDBMS的土地上,所以我上面想要做的事情可能沒有必要。任何有關這方面的見解將不勝感激。

謝謝!

編輯:修正了一些例子中的JSON語法。

回答

7

如果您只想要一個唯一值列表,那很簡單。如果你想識別重複,那麼它變得不那麼容易。

在這兩種情況下,像這樣的地圖功能就足夠了:

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

爲您減少功能,只需輸入_count

您的視圖輸出如下:(根據你的2個文件)

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

從那裏,你將有名稱的列表以及它們的頻率。您可以自行取得該列表並進行過濾,也可以採用「所有沙發」路線並使用_list function執行最終過濾。

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

閱讀關於_list功能,它們非常方便和多功能。

+0

...並獲取重複ID:?skip = 1&reduce = false&key =「car1」 – 2017-02-23 13:43:55