【问题标题】:Extracting nested values from documents in Cloudant从 Cloudant 中的文档中提取嵌套值
【发布时间】:2015-12-21 18:40:19
【问题描述】:

我在提取存储在 Cloudant (CouchDB) 中的值时遇到问题。下面是一个存储文档的示例。

{
"_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 ~ 无穷大。其中一个视图应显示一个数组,其中包含从与 John Doe 相关的所有文档中提取的所有值。目前该数据库仅包含与 John Doe 相关的文档,但将来会发生变化。

当前视图文档如下:

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

第一步是确保在构造数组之前可以提取所需的值。

emit(doc.SeqNo,null) 不只提供序列号,emit(SeqNo,doc.SeqNo) 也不提供 我的问题是,

如何只提取序列号?

然后我如何从结果中构建一个数组?

当我想提取 OtherData.1 值时,这会改变吗?

任何帮助将不胜感激。

【问题讨论】:

    标签: couchdb cloudant


    【解决方案1】:

    .forEach 正在返回单个记录,我认为此视图所需的 map 函数是

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

    【讨论】:

    • 谢谢。这行得通!知道如何提取嵌套值吗?例如OtherData.1? Record.Fields.OtherData.1 不起作用。查询可能仅限于两个字段,例如 Record.Fields 并且不超过。
    • 通过使用 emit(Record.SeqNo,Record.Fields[2].OtherData["1"]);提取了正确的值。
    猜你喜欢
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2017-04-12
    相关资源
    最近更新 更多