Представления Couchdb возвращают строки в строках - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь создать представление, которое возвращает имя с изменениями цены из документа.

"name": "USD"
"price_changes": {
    "0min": 0,
    "15min": 0,
    "30min": 0,
    "60min": 0,
    "90min": 0,
    "120min": 0,
    "150min": 0,
    "180min": 0,
    "210min": 0,
    "240min": 0,
    "270min": 0,
    ...

Мне нужно представление, которое возвращает все данные в "price_changes".

{"id":"c95718ebd00b13bc9a8b03a0e5005d51",
"key": {"0min":0,"15min":0,"30min":0,"60min":0,"90min":0,"120min":0,"150min":0,...}
{"id":"c95718ebd00b13bc9a8b03a0e5006906",
"key": {"0min":0,"15min":0,"30min":0,"60min":0,"90min":0,"120min":0,"150min":0,...}
...

И представления, которые возвращают набор строк, например, только «0 минут», «15 минут» и «30 минут» для каждого имени.

Как:

"id":"c95718ebd00b13bc9a8b03a0e5005d51",
"name": "USD", 
"key": {"0min":0,"15min":0,"30min":0}

Отдельно

"id":"c95718ebd00b13bc9a8b03a0e5006906",
"name": "GBP", 
"key": {"0min":0,"15min":0,"30min":0}

Что у меня есть (но не возвращает того, что я хочу):

function (doc) {
var mins, value;
if (doc.price_changes) {
  for (mins in doc.price_changes) {
    value = doc.price_changes[mins];
    emit(doc.id, [value], mins);
    }
  }
}

Есть идеи, ребята? Я ничего не могу найти при возврате таких данных.

1 Ответ

0 голосов
/ 02 мая 2018

Во-первых, в функции просмотра карты вы испускаете три вещи:

emit(doc.id, [value], mins);

Что не должно быть. Как документировано , вам необходимо испускать пары ключ / значение (ну, конечно, ключ или значение могут быть массивом многих вещей):

Функции карты принимают один документ в качестве аргумента и (необязательно) emit () пары ключ / значение , которые хранятся в представлении.


Согласно тому, что вы говорите:

Мне нужно представление, которое возвращает все данные в "price_changes".

Насколько я понимаю, вам нужна следующая функция карты:

function (doc) {
  var mins, value;
  if (doc.price_changes) {
    for (mins in doc.price_changes) {
      value = doc.price_changes[mins];
      emit(mins, [value, doc._id]);
    }
  }
}

И он возвращает:

$ curl -k -X GET https://admin:****@192.168.1.106:6984/sample-repl/_design/price/_view/price
{"total_rows":11,"offset":0,"rows":[
{"id":"so_q","key":"0min","value":[0,"so_q"]},
{"id":"so_q","key":"120min","value":[0,"so_q"]},
{"id":"so_q","key":"150min","value":[0,"so_q"]},
{"id":"so_q","key":"15min","value":[0,"so_q"]},
{"id":"so_q","key":"180min","value":[0,"so_q"]},
{"id":"so_q","key":"210min","value":[0,"so_q"]},
{"id":"so_q","key":"240min","value":[0,"so_q"]},
{"id":"so_q","key":"270min","value":[0,"so_q"]},
{"id":"so_q","key":"30min","value":[0,"so_q"]},
{"id":"so_q","key":"60min","value":[0,"so_q"]},
{"id":"so_q","key":"90min","value":[0,"so_q"]}
]}

Я не уверен, что приведенный выше результат соответствует вашим ожиданиям, пожалуйста, дайте мне знать, если я ошибаюсь.


Спасибо! Просто интересно, как бы я вернулся, скажем, первые 3 (например, 0 минут, 15 минут, 30 минут)

Чтобы получить первые 3, вы можете использовать limit параметр запроса, подобный этому, как вы можете видеть, он вернет первые 3:

$ curl -k -X GET https://admin:****@192.168.1.106:6984/sample-repl/_design/price/_view/price?limit=3
{"total_rows":11,"offset":0,"rows":[
{"id":"so_q","key":"0min","value":[0,"so_q"]},
{"id":"so_q","key":"120min","value":[0,"so_q"]},
{"id":"so_q","key":"150min","value":[0,"so_q"]}
]}

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

...