CouchDB使用tag = foo或tag = bar查看文档

时间:2011-11-11 17:37:07

标签: map couchdb

鉴于我的以下文件:

{
   _id: ###,
   type: "blogpost",
   title: "First blog post",
   tag: "tutorial"
}

{
   _id: ###,
   type: "blogpost",
   title: "Second blog post",
   tag: "report"
}

{
   _id: ###,
   type: "blogpost",
   title: "Third blog post",
   tag: "tutorial"
}

{
   _id: ###,
   type: "blogpost",
   title: "Fourth blog post",
   tag: "article"
}

现在,我想做的是:查找所有标记为文章或报告的博客帖子。

我已经在文档中读到我能够对视图或列表执行POST,允许搜索多个键。但这总是需要cURL或者其他什么?

2 个答案:

答案 0 :(得分:1)

如果您需要指定文章,在HTTP调用中报告为变量,那么您只需要一个视图和一个列表

查看:test_view

function(doc) {
  if (doc.tag) {
    emit(doc.tag, doc);
  }
};

列表:test_list

function(head, req) {
  start({
    "headers": {
      "Content-Type": "text/html"
    }
  });
  var row;
  var tags = req.query.tags;
  var tagArray = tags.split(',');
  while(row = getRow()) {
    if (tagArray.indexOf(row.key) != -1) {
      send(row.value.tag + ' : ' + row.value.title + '<br>');
    }
  }
}

现在,你可以获得list / html http://yourserver.com:5985/db/_design/test/_list/test_list/test_view?tags=article,report

答案 1 :(得分:0)

您将需要创建至少一个视图才能使其正常工作。我不太了解你的需求,所以我只是做一个简单的例子而不考虑它是实现你想要的最佳方式。

http://yourserver.com:5984/_utils访问Futon,并在数据库中创建一个视图。您只需要一个地图功能来完成您的要求:

function(doc) {
    if (doc.tag && (doc.tag == "article" || doc.tag == "report")) {
        emit(doc.tag, doc);
    }
}

如果您保存视图并将其命名为articles_or_reports,则可以使用此请求从视图中获取数据:

http://yourserver.com:5984/db/_design/test/_view/articles_or_reports

将返回

{"total_rows":2,"offset":0,"rows":[
{"id":"168ba21f7209994b69336dd8c30041f3","key":"article","value":{"_id":"168ba21f7209994b69336dd8c30041f3","_rev":"1-f033b30522d09c33cbd68332b89c95a7","type":"blogpost","title":"Fourth blog post","tag":"article"}},
{"id":"168ba21f7209994b69336dd8c3003139","key":"report","value":{"_id":"168ba21f7209994b69336dd8c3003139","_rev":"1-f7a473afc253972f7cfec62a335dcb23","type":"blogpost","title":"Second blog post","tag":"report"}}
]}
  

但这总是需要cURL或者其他什么?

这取决于您的应用程序,但CouchDB的唯一接口是通过HTTP。有许多语言的库可以将您的交互带到更高的层次。