CouchDB 搜索视图嵌套数组

vu8f3i0k  于 2022-12-09  发布在  CouchDB
关注(0)|答案(1)|浏览(167)

我在一些文档中得到了比赛参与者的数据,这些数据是按比赛阶段、跑步者的位置和跑步者通过阶段的时间组织的。
我需要找到一个特定的bib(?key=357),并获取它最后一次经历某个阶段的时间(doc.bib_data[i].time),它是哪个阶段(id)和位置(i)。
如果指定特定的bib_data数组索引,则会得到结果,但如果循环遍历bib_data,则不会得到任何结果,即使不过滤任何内容。
带有特定索引的VIEW,以显示文档数据的外观:

function (doc, meta) {
  emit(doc.bib_data[2].bib,doc.bib_data[2].time);
}

结果:

{
 "id": "007",
 "key": "357",
 "value": "1910:38",
 "doc": {
  "_id": "007",
  "_rev": "4-bdce057c8ad2ce975b9ffca9eb9dfd82",
  "ew_ham": "KM6WKA",
  "stage_ew_ham": "KK6DA",
  "bib_data": {
   "1": {
    "bib": "45",
    "time": "1910:35"
   },
   "2": {
    "bib": "357",
    "time": "1910:38"
   },
   "3": {
    "bib": "22",
    "time": "1910:40"
   }
  }
 }
}

如何仅获得“bib:357”的结果?
我需要收集阶段、位置和时间,即[“007”、“2”、“1910:38”]

"2": {
    "bib": "357",
    "time": "1910:38"
   },

以下是我当前的问题:

http://[IP_ADDR]:5984/[DB_NAME]/_design/[DESIGN_DOC]/_view/[VIEW_NAME]?key=123

我的VIEW试图循环bib_data:

function (doc, meta) {
  for(i=0;i<doc.bib_data.length;i++) {
    if(doc.bib_data[i].bib) {
      emit( i, doc.bib_data[i].bib, doc.bib_data[i].time );
    }
  }
}

不返回任何结果。

lsmepo6l

lsmepo6l1#

视图代码

function(doc, meta) {
  for (i = 0; i < doc.bib_data.length; i++) {
    if (doc.bib_data[i].bib) {
      emit(i, doc.bib_data[i].bib, doc.bib_data[i].time);
    }
  }
}

这是完全错误的,因为它试图索引迭代bib_data,就好像它是一个数组,但 * 它是一个对象 *。

function (doc) {
  for (var key in doc.bib_data) {
    if (doc.bib_data.hasOwnProperty(key)) {
      var item = doc.bib_data[key];
      /* do something with the bib item. */
    }
  }
}

现在是时候发出感兴趣的数据了。虽然还不清楚你的帖子想要什么,但这里有一个开始,注意我发出的是看起来像数字的数据,而不是字符串:

function (doc) {
  for (var key in doc.bib_data) {
    if (doc.bib_data.hasOwnProperty(key)) {
      var item = doc.bib_data[key];
      if(item.bib) {
        emit([parseInt(item.bib), parseInt(key), item.time]);
      }
    }
  }
}

假设您发布的文档是数据库中唯一一个design doc和view name为bib的文档,请使用cURL:

curl -G <url to db>/_design/bib/_view/bib

将返回
{“总行数”:3,“偏移量”:0,“行数”:[
{【编号】:【007】,【关键字】:[22,3,“1910:40”],“价值”:空},
{【编号】:【007】,【关键字】:[45,1,“1910:35”],“价值”:空},
{【编号】:【007】,【关键字】:[357,2,“1910:38”],“价值”:空值}
]}
因为bib视图生成了一个复杂的键,所以必须使用start_keyend_key查询[2]。

curl -G <url to db>/_design/bib/_view/bib -d "start_key=[357]" -d "end_key=[357,{}]"

将返回
{“总行数”:3,“偏移量”:2,“行数”:[
{“编号”:“007”,“密钥”:[357,2,“1910:38”],“值”:空}
]}
我没有看到合并索引/键有多大的实用性-也许你想要这个代替?

emit([parseInt(item.bib), item.time], parseInt(key));

1个
2/{数据库}/_设计/{数据文档}/_视图/{视图}

相关问题