如何在两个(或更多)键上使用CouchDB视图进行过滤

时间:2012-09-09 12:49:05

标签: couchdb

我在couchdb存储中有以下json(简化)对象:

[{
    "_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
}]

我想使用密钥[“5ea7a53e670b432e0fe22a7bc10024db”,2](作业ID和扫描编号)发布请求。如何为视图创建一个map函数来过滤掉具有给定id的作业以及与job_id和数字匹配的度量?

谢谢, 拉杜

1 个答案:

答案 0 :(得分:1)

您对该请求的预期输出是什么?如果您只想进行扫描,请在map中发出要搜索的密钥:

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

如果您需要两个文档 - 作业(完整文档,而不仅仅是id)和扫描,请在请求中使用emit参数的单个include_docs=true中同时发出这两个文档网址:

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});
  }
}

您将在网址中获得包含startkey=["5ea7a53e670b432e0fe22a7bc10024db", 2]&endkey=["5ea7a53e670b432e0fe22a7bc10024db", 2, {}]&include_docs=true(或keys=[])的文档。

检查include_docs选项的view API