关于视图:CouchDB“加入”两个文档

CouchDB “Join” two documents

我有两个文件看起来有点像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Doc
{
  _id: AAA,
  creator_id: ...,
  data: ...
}

DataKey
{
  _id: ...,
  credits_left: 500,
  times_used: 0,
  data_id: AAA
}

我想要做的是创建一个视图,允许我传递DataKey id(key = DataKey _id)并获取DataKey和Doc的信息。

我的尝试:

我首先尝试在Doc中嵌入DataKey并使用map函数,如下所示:

1
2
3
4
5
6
7
8
9
10
11
function (doc)
{
  if (doc.type =="Doc")
  {
    var ids = [];
    for (var i in doc.keys)
      ids.push(doc.keys[i]._id);

    emit(ids, doc);
  }
}

但我遇到了两个问题:

  • 每个可以有多个DataKey
    Doc使用startkey = [idhere ...]
    和endkey = [idhere ...,{}]没有
    工作(只有在关键时刻才有效
    成为阵列中的第一个)。
  • 所有数据键都必须是唯一的,我宁愿不制作像{_id = datakey}这样的单独文档来保留密钥。
  • 有谁有想法我怎么能做到这一点?如果有什么不清楚,请告诉我。

    - - -编辑 - - -

    我忘了提到在我的应用程序中我不知道Doc ID是什么,所以我需要能够搜索DataKey的ID。


    我想你想要的是什么

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function (doc)
    {
      if (doc.type =="Doc")
      {
        emit([doc._id, 0], doc);
      }

      if(doc.type =="DataKey")
      {
        emit([doc.data_id, 1], doc);
      }
    }

    现在,使用key=["AAA"]查询视图,您将看到所有文档的列表。 第一个将是真正的"Doc"文档。 所有其余的将是"DataKey"文档,它们引用了第一个doc。

    这是一种常见的技术,称为CouchDB视图排序规则。