1

我不知道如何仅通过 CouchDB 解决我的问题,而无需计算客户端。

我有一个数据库,其中包含表示笔记(类型:“note”)和标签(类型:“tag”)的文档。一个标签有一个类别(例如类别:“待办事项”或类别:“地点”)。还有其他类别的标签。

笔记有一个标签列表,作为所需标签文档的 ID 列表给出。

例子:

{id:"1", type:"note", tags:[2,3,...],   text:"blablabla"}
{id:"2", type:"tag",  category:"todo",  what:"foo"}
{id:"3", type:"tag",  category:"place", description:"The leaning tower of Pisa"}
{id:"4", type:"note", tags:[5,...],     text:"blablabla"}
{id:"5", type:"tag",  category:"place", description:"Mount Everest"}

Note 1 有待办事项,Note 5 没有。待办事项标签列表是:[2]

我想要的是一个地点标签列表,这样在那些在他们的列表中也有一个待办事项标签的地方有注释,即“有待办事项的地方”:[3]。

我希望 couchDB 完成所有工作,而不是通过提取这些信息来打扰客户。不幸的是,我自己找不到解决方案(我考虑了视图、视图排序规则、列表函数)。

但我想这是可以做到的......你们中的任何人都知道怎么做吗?

提前致谢!

4

1 回答 1

0

您可以使用 map 功能为笔记生成所有标签对:

function (doc) {
  if (!doc.type || !doc.tags || doc.type != "note") return;
  for (var i in doc.tags) {
    for (var j in doc.tags) {
      if (i != j) emit([doc.tags[i],doc.tags[j]], doc);
    }
  }
}

并查询[tag1, tag2]. 问题是您决定对标签使用无意义的 ID,因此您必须先了解两个标签的 ID 才能进行查询。将方案更改为:

{_id: "12345", type:"note", tags:["todo","place",...], text:"blablabla"}
{_id: "todo",  type:"tag",  ...}
于 2013-08-15T19:16:42.960 回答