1

我正在研究 Hyperledger 结构。我需要数组中的特定值而不是 CouchDB 中的完整文档。

例子

{
  "f_id": "1",
  "History": [
    {
      "amount": "1",
      "contactNo": "-",
      "email": "i2@mail.com"
    },
    {
      "amount": "5",
      "contactNo": "-",
      "email": "i@gmail.com",

    }
  ],
  "size": "12"
} 

我只想要历史数组上的电子邮件:“i2@mail.com”对象,而不是完整的历史数组。

芒果查询:

{
   "selector": {
      "History": {
         "$elemMatch": {
            "email": "i2@mail.com"
         }
      }
   }
}

输出:

{
      "f_id": "1",
      "History": [
        {
          "amount": "1",
          "contactNo": "-",
          "email": "i2@mail.com"
        },
        {
          "amount": "5",
          "contactNo": "-",
          "email": "i@gmail.com",

        }
      ],
      "size": "12"
    } 

完整的历史数组但只需要历史数组的第一个对象

谁能指导我?

谢谢。

4

1 回答 1

1

我认为这是不可能的,因为丰富的查询用于根据给定的选择器检索完整的记录(键值对)。

您可能需要重新考虑您的设计。例如,如果您想从那里保存历史记录和查询,这种方法可能会奏效:

  1. GetState 的特殊键my_record
  2. 如果密钥存在:

    • PutState 带有 key 的新值my_record
    • 使用附加属性丰富旧值:{"DocType": "my_history", "time": "789546"}. 借助这些新属性,可以创建索引并通过查询进行搜索。
    • PutState使用新键丰富了旧值my_record_<uniqueId>
  3. 如果 key 不存在,只需将您的值与 key 放在一起,my_record而无需任何新属性。

使用这种方法,my_record密钥将始终保持最新值。您可以使用索引(或不使用索引,根据您的性能问题)查询具有/不分页的任何属性的历史记录。

这种方法也将是占用空间较小的方法。因为如果您在单个键上累积历史记录,则每次都会将现有历史记录复制到下一个版本,这意味着您的每个条目都会消耗previous_size + delta,而不仅仅是delta.

于 2020-06-10T15:43:38.587 回答