2010-10-26 52 views
1

我有一些文件有2組屬性:標記和代替。這裏是他們的樣子的例子:完整加入/在couchdb交叉點

{ 
    title: "doc1", 
    tag: ["mountain", "sunny", "forest"], 
    lieu: ["france", "luxembourg"] 
}, 
{ 
    title: "doc2", 
    tag: ["sunny", "lake"], 
    lieu: ["france", "germany"] 
}, 
{ 
    title: "doc3", 
    tag: ["sunny"], 
    lieu: ["belgium", "luxembourg", "france"] 
} 

我該如何映射/減少和查詢我的數據庫,以便能夠檢索只有符合這些標準的文檔的交集:

  • 代替: [ 「法國」, 「盧森堡」]
  • 標籤: 「陽光燦爛」]

返回:DOC1和doc3的

我找不出任何格式的map/reduce可能只能返回一個查詢。我現在正在做的是:發出每個代替/標籤作爲關鍵字,並將文檔的ID作爲值相關,然後減少每個鍵的文檔ID。然後從我的應用程序查詢這個視圖,在應用程序端做一個文檔的交集(只帶有具有3個鍵(盧森堡,法國和陽光)的文檔,然後用這些文檔的id再次查詢couchdb以檢索實際的文檔。我覺得這不是正確的/最好的辦法嗎?

我使用列表來做交點工作,它工作得很好。但我仍然需要做其他請求來獲取使用文檔的文檔IDS。任何想法,我還能有什麼不同直接檢索文件?

謝謝!

回答

1

這將是尷尬的,其基本思想是,你必須建立一個視圖,其中地圖福nction以標籤和國家的每種可能的組合作爲關鍵詞,並且沒有減少功能。通過這種方式,查找["france","luxembourg"]將返回發出該鍵的所有文檔(因此位於交集中),因爲沒有reduce函數的視圖會爲每個條目返回發送文檔。這樣,你只需要做一個請求。

這會導致大量的發射發生的,但是你可以通過排序來解決降低這個數字既發射和搜索時,當(自動打開["luxembourg","france"]["france","luxembourg"]),並通過利用的CouchDB的查詢前綴的能力優勢(這意味着發光["belgium","france","luxembourg"]將讓您匹配搜索["belgium"]["belgium","france"])。

在你上面的例子,對國家,你只會發出:

// doc 1 
emit(["luxembourg"],null); 
emit(["france","luxembourg"],null); 

// doc 2 
emit(["germany"],null); 
emit(["france","germany"],null); 

// doc 3 
emit(["luxembourg"],null); 
emit(["belgium","luxembourg"],null); 
emit(["france","luxembourg"],null); 
emit(["belgium","france","luxembourg"],null); 

不管怎樣,對於這樣一個複雜的查詢,考慮尋找到的CouchDB,Lucene的組合。