查询cloudant中的子域:

时间:2015-09-19 09:56:33

标签: subquery ibm-cloud cloudant nosql

我的数据库包含具有以下结构的文档:

{
  "_id": "xx",
  "_rev": "xx",
  "metadata": [
    {
      "name": "par1",
      "value": "val1"
    },
    {
      "name": "par2",
      "value": "val2"
    },
    {
      "name": "par3",
      "value": "val3"
    },
    {
      "name": "par4",
      "value": "val4"
    }
  ]
}

我想运行一些类似的查询:

{
  "selector": 
  {
    "metadata.name":"par1"
   }
 }

但目前我上面的选择器不起作用。 我为所有字段创建了一个文本类型索引。基本上我想对子字段进行查询,其中子字段本身是一个包含2个数据成员的对象" name"和"价值"。任何帮助或线索将不胜感激。

1 个答案:

答案 0 :(得分:2)

您的选择器无法直接访问metadata.name,因为metadata是一个数组。一些可能满足您目标的选项:

1)如果您为所有字段创建了全文索引,并且想要搜索" par1"在任何领域,那么你的选择器就像下面的选择器一样。需要注意的是,它会返回文档,其中" par1"是任何索引字段:

{
  "selector":
  {
    "$text": "par1"
  }
}

2)如果要专门搜索元数据[i] .name字段包含" par1"的文档,则可以为元数据[i] .name值上的文档创建视图map函数看起来像:

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

然后,您可以获取所有名称&#39;是&#39; par1&#39;使用以下内容(用您的特定标识符替换花括号中的所有值):

curl -s https://{userid}:{password}@{userid}.cloudant.com/{db_name}/_design/{design_doc_name}/_view/{view_name}?key=%22par1%22&include_docs=true