2012-09-09 50 views
1

我有以下的JSON(簡體)在CouchDB的存儲對象:如何用CouchDB的視圖篩選器上的兩個(或更多)鍵

[{ 
    "_id": "5ea7a53e670b432e0fe22a7bc10024db", 
    "_rev": "1-ae70c8906f7aa6d73539a89f7ad960ee", 
    "type": "job" 
}, { 
    "_id": "5ea7a53e670b432e0fe22a7bc10041d9", 
    "_rev": "4-fa0ba68c35ca548b497a7309389f9087", 
    "type": "scan", 
    "job_id": "5ea7a53e670b432e0fe22a7bc10024db", 
    "number": 1 
}, { 
    "_id": "5ea7a53e670b432e0fe22a7bc100520e", 
    "_rev": "4-3e6b1a028786c265ecb7362e245d049e", 
    "type": "scan", 
    "job_id": "5ea7a53e670b432e0fe22a7bc10024db", 
    "number": 2 
}] 

我想要的鑰匙[」 POST請求5ea7a53e670b432e0fe22a7bc10024db「,2](作業ID和掃描號碼)。如何爲視圖創建映射函數以篩選出具有給定ID以及與job_id和數字匹配的度量的作業?

感謝, 拉杜

回答

1

什麼是你所期望的要求的輸出?如果您需要兩個文件

function (doc) { 
    if (type == "scan" && number) { 
    emit([doc.job_id, doc. number], doc); 
    } 
} 

- 工作(完整的文檔,而不僅僅是id)和掃描,或者發出:如果你只是想要得到的掃描,發出在map你想搜索的關鍵他們兩人在單emitinclude_docs=true參數請求的URL:

function (doc) { 
    if (doc.type == "scan" && doc.number) { 
    emit([doc.job_id, doc. number], {scan: doc, _id: doc.job_id}); 
    } 
} 

或兩個emit的有:

function (doc) { 
    if (doc.type == "scan" && doc.number && doc.job_id) { 
    emit([doc.job_id, doc. number, "job"], {_id: doc.job_id); 
    emit([doc.job_id, doc. number, "scan"], {_id: doc._id}); 
    } 
} 

您將在URL中獲得帶有startkey=["5ea7a53e670b432e0fe22a7bc10024db", 2]&endkey=["5ea7a53e670b432e0fe22a7bc10024db", 2, {}]&include_docs=true(或keys=[])的文檔。

檢查view APIinclude_docs選項。

+0

謝謝你的建議,它的工作就像一個魅力!我試圖手動發出作業以及掃描,而不是使用include_docs選項。儘管如此:爲什麼endkey參數在最後有一個空對象?它似乎工作得很好,沒有它... – Radu

+0

@Radu,閱讀http://wiki.apache.org/couchdb/View_collat​​ion –

+1

@Radu:這是因爲排序順序。你可以把'{}'看作上限。 –

相關問題