我有两个看起来像这样的文档:

Doc
{
  _id: AAA,
  creator_id: ...,
  data: ...
}

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


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

我的尝试:

我首先尝试将DataKey嵌入到Doc中,并使用了如下的map函数:

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}这样的单独文档来保留密钥。


有谁知道我如何做到这一点?让我知道是否有任何不清楚的地方。

- - -编辑 - - -

我忘了提及我的应用程序中我不知道文档ID是什么,因此我需要能够搜索DataKey的ID。

最佳答案

我想你想要的是

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”文档。

这是一种常见的技术,称为CouchDB view collation

08-28 05:59