couchdb视图,用于在数组字段中搜索作为键数组传入的值

Tro*_*roy 6 couchdb views

我在couchdb中有一些文件,其中包含不同关联文档的id数组字段:

{
  associatedAssets: ["4c67f6241f4a0efb7dc2abc24a004dfe",  "270fd4508a1222a1e2a27cbe7f002d9z"]
}
Run Code Online (Sandbox Code Playgroud)

我想写一个视图,让我传入一个本身就是一个id数组的键,然后返回其associatedAssets字段包含一个或多个通过键数组传入的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]);
});
Run Code Online (Sandbox Code Playgroud)

将返回其associatedAssets数组包含一个或多个键"4c67f6241f4a0efb7dc2abc24a004dfe","6c67f6241f4a0efb7dc2abc24a004dfd"的文档.

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

谢谢!

sma*_*thy 11

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

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

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

总而言之 - 假设最近的CouchDB版本,最好的做法是替换docemit{ _id: doc._id },然后include_docs=true在你的查询中使用,这样你的视图索引就不会被完整的文档填满(不必要).