6

我在 couchdb 中有一些文档,它们的字段是不同关联文档的 id 数组:

{
  associatedAssets: ["4c67f6241f4a0efb7dc2abc24a004dfe",  "270fd4508a1222a1e2a27cbe7f002d9z"]
}

我想编写一个视图,让我传入一个本身就是一个 id 数组的键,然后返回其相关资产字段包含一个或多个通过键数组传入的 id 的文档,例如

$.ajax({
  url: "/db/_design/design_doc/_view/summaryByAssociatedAssets",
  type: "post",
  data: JSON.stringify({keys: ["4c67f6241f4a0efb7dc2abc24a004dfe", "6c67f6241f4a0efb7dc2abc24a004dfd"]}),
  dataType: "json",
    contentType: "application/json",
})
.done(function(resp){
  console.log(resp[0]);
});

将返回其 associatedAssets 数组包含一个或多个键“4c67f6241f4a0efb7dc2abc24a004dfe”、“6c67f6241f4a0efb7dc2abc24a004dfd”的文档。

我无法访问我视图中的密钥,所以我不确定我是否可以这样做?有没有更好的方法来实现这一点?

谢谢!

4

2 回答 2

11

您的视图只需要为每个associatedAssets元素生成一个输出行,如下所示:

function(doc) {
  if( doc.associatedAssets ) {
    for( var i=0, l=doc.associatedAssets.length; i<l; i++) {
      emit( doc.associatedAssets[i], doc );
    }
  }
}

然后您需要调整您的调用,以便最终将该keys数组作为查询字符串参数传递,该参数将仅返回视图中与该数组中的键匹配的行。

总而言之 - 假设最近的 CouchDB 版本,最佳实践是在您的 with 中替换doc然后emit{ _id: doc._id }include_docs=true的查询中使用,这样您的视图索引就不会(不必要地)被完整的文档填充。

于 2012-06-23T07:29:37.740 回答
0

在视图代码中,您可以访问文档本身的任何内容,但无法访问您传入的任何参数。

您可以使用为您正在执行的特定查询生成的临时视图。

您也可以改用 ElasticSearch。ElasticSearch 具有更丰富的查询 DSL,因为这就是 ElasticSearch 的全部意义所在。CouchDB River 允许您自动索引 CouchDB 中的所有文档。

使用 ElasticSearch,您可以只搜索其相关资产包含您传入的列表中的任何元素的任何文档。

于 2012-06-23T06:25:10.983 回答