【问题标题】:CouchDB & tagged docs: howto get tags s.t. there are docs with that tag and another tagCouchDB 和标记文档:如何获取标记 s.t.有带有该标签和另一个标签的文档
【发布时间】:2013-08-15 07:54:18
【问题描述】:

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

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

注释有一个标签列表,以所需标签文档的 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 完成所有工作,而不是为客户提取这些信息而烦恼。不幸的是,我自己找不到解决方案(我考虑了视图、视图排序、列表函数)。

但我想这是可以做到的……你们中有人知道怎么做吗?

提前致谢!

【问题讨论】:

    标签: join tags couchdb


    【解决方案1】:

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

    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",  ...}
    

    【讨论】:

    • 感谢您的回复。您的方法将生成相当大的视图,因为有几百个,可能是几千个,最多有 10 个标签的笔记!在我看来,仅仅为了这个简单的查询而生成这个视图是不合理的。
    • 您对无意义的文档 ID 是正确的,但 ID“todo”不是一个选项,因为有多个 todo。给定更好的 id,对于我的查询(“给我有待办事项的地方”),我必须对元组 [tag1,tag2] 进行某种范围查询,这是不可能的(据我了解)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多