2015-12-21 3 views
0

У меня возникли проблемы с извлечением значений, хранящихся в Cloudant (CouchDB). Ниже приведен пример сохраненного документа.Извлечение вложенных значений из документов в Cloudant

{ 
"_id": "d47cd130de736894be5c464c314f1083", 
    "_rev": "1-2baf765d6f78bd80b4a604718063c0eb", 
    "Name": John, 
    "Surname": "Doe", 
    "ID": "89884600000001936983", 
    "Records": [ 
    { 
     "SeqNo": 14776, 
     "Reason": 25, 
     "DateUTC": "2015-12-01 01:59:35", 
     "Fields": [ 
     { 
      "HeartRate": "68", 
      "Weight": "75", 
     }, 
     { 
      "Eyesight": 20, 
     }, 
     { 
      "OtherData": { 
      "1": 4217, 
      "2": 1179, 
      "3": 2588, 
      "4": 2488, 
      "5": 21 
      }, 
      "FType": 6 
     } 
     ] 
    }, 
    { 
     "SeqNo": 14777, 
     "Reason": 25, 
     "DateUTC": "2015-12-05 02:00:35", 
     "Fields": [ 
     { 
      "HeartRate": "72", 
      "Weight": "78", 
     }, 
     { 
      "Eyesight": 20, 
     }, 
     { 
      "OtherData": { 
      "1": 4217, 
      "2": 1198, 
      "3": 2588, 
      "4": 2488, 
      "5": 21 
      }, 
      "FType": 6 
     } 
     ] 
    } 
    ] 
} 

База данных содержит множество документов, и каждый документ содержит несколько записей данных, обозначенных порядковым номером. Количество записей (последовательностей) данных на одном документе может быть от 1 до бесконечности. В одном из представлений должен отображаться массив, содержащий все значения, извлеченные из всех документов, относящихся к Джону Доу. В настоящее время база данных содержит только документы, относящиеся к Джону Доу, но это изменится в будущем.

Текущий вид документа выглядит следующим образом:

function(doc) { 
    if(doc.Records) { 
    doc.Records.forEach(function(SeqNo) { 
     emit(SeqNo,null); 
    }); 
    } 
} 

Это дает следующий результат для каждой записи данных (отдельный результат для каждой последовательности):

{ 
"id": "d47cd130de736894be5c464c314f1083", 
"key": { 
    "SeqNo": 14776, 
    "Reason": 25, 
    "DateUTC": "2015-12-01 01:59:35", 
    "Fields": [ 
    { 
    "HeartRate": "68", 
    "Weight": "75", 
    }, 
    { 
    "Eyesight": 20, 
    }, 
    { 
    "OtherData": { 
    "1": 4217, 
    "2": 1179, 
    "3": 2588, 
    "4": 2488, 
    "5": 21 
    }, 
    "FType": 6 
    } 
    ] 
}, 
"value": null, 
"_id": "d47cd130ce736894be5c464c314f1083" 
} 

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

Испустите (doc.SeqNo, нуль) не обеспечивает порядковый номер только, и не излучает (SEQNO, doc.SeqNo) Мои вопросы,

как извлечь только номер последовательности?

Как мне построить массив из результатов?

будет ли это изменяться, когда я хочу извлечь значение OtherData.1?

Любая помощь будет принята с благодарностью.

ответ

2

.forEach возвращается индивидуальный рекорд, я думаю, что функция map вам нужно для этого вида является

function(doc) { 
    if(doc.Records) { 
    doc.Records.forEach(function(Record) { 
     emit(Record.SeqNo, null); 
    }); 
    } 
} 
+0

Спасибо. Это работает! Любая идея, как извлечь вложенные значения? Например, OtherData.1? Record.Fields.OtherData.1 не работает. Запрос, вероятно, ограничен двумя полями, такими как Record.Fields и не более. –

+0

Используя emit (Record.SeqNo, Record.Fields [2] .OtherData ["1"]); извлекается правильное значение. –

Смежные вопросы