搜索视图嵌套数组

问题描述 投票:1回答:1

我在某些文档中有比赛参与者数据,这些数据是按照比赛阶段,跑步者位置和跑步者经过舞台的时间来组织的。

我需要找到一个特定的围嘴(?key = 357),并抓住它最后一次通过一个阶段(doc.bib_data [i] .time),该阶段是(id)和位置(i)。

如果指定特定的bib_data数组索引,则会得到结果,但是如果遍历bib_data,即使没有进行任何过滤,也不会得到任何结果。

使用特定索引查看,以显示文档数据是什么样的:

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

以及我试图遍历bib_data的VIEW:

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 );
    }
  }
}

未返回任何结果。

search view couchdb
1个回答
1
投票

查看代码

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进行索引,就好像它是一个数组,但它是一个对象。因此,请先修复[[1]

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]);
      }
    }
  }
}

鉴于您发布的文档是数据库中唯一的文档,其设计文档和视图名称使用cURL为bib

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

将返回

{“ total_rows”:3,“ offset”:0:“ rows”:[{“ id”:“ 007”,“ key”:[22,3,“ 1910:40”],“ value”:null},{“ id”:“ 007”,“ key”:[45,1,“ 1910:35”],“ value”:null},{“ id”:“ 007”,“键”:[357,2,“ 1910:38”],“值”:空}]}

因为bib视图正在生成一个复杂的密钥,所以必须使用start_keyend_key查询[2]。因此,要获取bib为357的查看文档,>

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

将返回

{“ total_rows”:3,“ offset”:2,“ rows”:[{“ id”:“ 007”,“ key”:[357,2,“ 1910:38”],“ value”:null}]}

我在合并索引/关键字方面没有看到太多实用程序,也许您想要这个呢?

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


1Iterate through object properties2/{db}/_design/{ddoc}/_view/{view}
© www.soinside.com 2019 - 2024. All rights reserved.