2011-05-31 63 views
3

我需要一個CouchDB的觀點,我可以取回所有不具有任意字段的文件。如果您事先知道文檔可能沒有的字段,這很容易實現。 For example,這可以讓你發送view/my_view/?key="foo"輕鬆檢索文檔,而不「富」字段:查找文檔的CouchDB缺少任意字段

function (doc) { 
    var fields = [ "foo", "bar", "etc" ]; 

    for (var idx in fields) { 
    if (!doc.hasOwnProperty(fields[idx])) { 
     emit(fields[idx], 1); 
    } 
    } 
} 

但是,你只限於詢問視圖設置的三個字段;像view/my_view/?key="baz"這樣的東西不會給你任何東西,即使你有很多文件缺少該字段。我需要一個視圖 - 我不需要提前指定可能的缺失字段。有什麼想法嗎?

回答

1

不知道的可能領域提前,答案很簡單。您必須創建一個新視圖來查找缺失的字段。該視圖將逐個掃描每個文檔。

爲了避免干擾現有的意見和設計文檔,你可以使用一個全新的設計文檔。這樣,搜索缺少的字段不會影響您可能已經使用的現有視圖。

2

這種技術被稱爲泰式按摩。如果(且僅當)視圖在文檔ID上鍵入時,可以使用它在視圖中高效地查找文檔而不是

function(doc) { 
    // _view/fields map, showing all fields of all docs 
    // In principle you could emit e.g. "foo.bar.baz" 
    // for nested objects. Obviously I do not. 
    for (var field in doc) 
     emit(field, doc._id); 
} 

function(keys, vals, is_rerun) { 
    // _view/fields reduce; could also be the string "_count" 
    return re ? sum(vals) : vals.length; 
} 

要找到不具有該領域的文件,

  1. GET /db/_all_docs並記住所有的ID
  2. GET /db/_design/ex/_view/fields?reduce=false&key="some_field"
  3. _all_docs比較IDS VS從查詢的ID。

_all_docs中的ID不在視圖中的那些缺少該字段。

這聽起來很糟糕,保持IDS在內存中,但是你不就得了!您可以使用合併排序策略,同時遍歷兩個查詢。你開始用的第一個ID具有列表(從視圖)和列表的第一個ID(從_all_docs)。

  1. 如果充分 < 具有,它缺少字段,與下一個充分元件
  2. 如果充分 = 具有重做,它具有場,重做與下一個元素
  3. 如果>,重做下一個元素

不同的語言,這可能是困難的。但是,例如,在Javascript中或其他事件驅動的編程框架中,它非常容易。