如果文档包含数组属性中的值,则从cloudant db中检索文档

时间:2016-10-20 21:37:36

标签: database views cloudant nosql

这就是我目前的做法,是否有更好的(更高效或更简单)方式?

Cloudant db中的文档:

1 ..

{
  "_id": "someId",
  "_rev": "someRev",
  "title": "someTitle",
  "parentDirectories": [
    '/', '/base_dir'
  ]
}

2 ..

{
  "_id": "someId2",
  "_rev": "someRev",
  "title": "someTitle2",
  "parentDirectories": [
    '/', '/base_dir'
  ]
}

目前,我在view中定义了此Cloudant并将include_docs参数设置为true,以便返回整个对象(这是必需的)..

function (doc) {
  if (doc.parentDirectories) {
    for (i = 0; i < doc.parentDirectories.length; i++) {
      emit(doc.parentDirectories[i], {_id: doc._id});
    }
  }
}

并使用..

调用view
/<database>/_design/<design-doc>/_view/my_view?include_docs=true

keys参数设置为:['/'],以便视图返回上面的2个文档。

1 个答案:

答案 0 :(得分:0)

你的解决方案很好。创建一个索引,其索引是数组中的键,这是检索包含已知值的文档的一种非常好的方法。一个小的迭代将作为值发出null,因为您无论如何都在查询时检索整个文档(使用include_docs=true):

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

您还可以发出文档的子集:

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

意味着您可以避免使用include_docs = true,以获得更快的响应。