Поиск просмотра вложенных массивов - PullRequest
1 голос
/ 18 апреля 2020

У меня есть данные участника гонки в некоторых документах, упорядоченных по этапу гонки, положению бегуна и времени прохождения бегуна через этап.

Мне нужно найти конкретный нагрудник (? Ключ = 357 ) и захватить последний раз, когда он прошел этап (do c .bib_data [i] .time), на каком этапе он был (id) и положение (i).

Если я укажу конкретный индекс массива bib_data, я получу результаты, но если я пропущу oop через bib_data, я не получу никаких результатов, даже если я ничего не фильтрую.

ПРОСМОТР с указанным c индексом, чтобы показать, как выглядят данные документа:

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"
   }
  }
 }
}

Как получить результаты ТОЛЬКО для " нагрудник: 357 "?

Мне нужно собрать сцену, позицию и время, т.е. [" 007 "," 2 "," 1910: 38 "]

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

Вот мой текущий QUERY:

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

И мой ВИД, который пытается l oop через 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 );
    }
  }
}

, который не возвращает результатов.

1 Ответ

1 голос
/ 19 апреля 2020

Код представления

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

Учитывая, что do c вы опубликовали как единственное do c в базе данных с дизайном do c и просмотром имени как bib с использованием cURL:

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

вернет

{"total_rows": 3, "смещение": 0 "строки": [ {"id": "007", "key": [22,3, "1910: 40"], "value": null}, {"id": "007", "key": [45,1, "1910: 35"], "value": null}, {"id": "007", "key": [357,2, "1910: 38"], "value": null} ]}

Поскольку представление bib генерирует сложный ключ, необходимо запросить [2] , используя start_key и end_key. Таким образом, для просмотра документов с bib из 357

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

будет возвращено

{"total_rows": 3, "offset": 2, "lines": [ {"id": "007", "key": [357,2, "1910: 38"], "value": null}
]}

Я не вижу большой пользы от включения индекса / ключа - может быть, вы хотите вместо этого?

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

1 Итерация по свойствам объекта 2 / {db} / _ design / {ddoc} / _ view / {view}

...