在couchDB的数组字段上应用一个过滤器。

问题描述 投票:1回答:1

我正在研究Hyperledger fabric。我需要从数组中获取一个特定的值,而不是在CouchDB中获取一个完整的文档。

例子

{
  "f_id": "1",
  "History": [
    {
      "amount": "1",
      "contactNo": "-",
      "email": "[email protected]"
    },
    {
      "amount": "5",
      "contactNo": "-",
      "email": "[email protected]",

    }
  ],
  "size": "12"
} 

我只想要一个 电子邮件:"[email protected]" 对象在 历史 数组,而不是一个完整的历史数组。

芒果查询。

{
   "selector": {
      "History": {
         "$elemMatch": {
            "email": "[email protected]"
         }
      }
   }
}

输出:

{
      "f_id": "1",
      "History": [
        {
          "amount": "1",
          "contactNo": "-",
          "email": "[email protected]"
        },
        {
          "amount": "5",
          "contactNo": "-",
          "email": "[email protected]",

        }
      ],
      "size": "12"
    } 

完整的历史记录 数组 但只需要第一个对象的 历史阵列。

谁能指导我一下?

谢谢,我正在研究Hyperledger fabric。

couchdb hyperledger-fabric blockchain hyperledger-chaincode couchdb-mango
1个回答
1
投票

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

你可能要重新考虑你的设计。例如,如果你想保存一个历史记录,并从那里进行查询,这种方法可能会成功。

  1. GetState of your special key my_record.
  2. 如果键存在。

    • PutState new value with key my_record.
    • 用额外的属性丰富旧值。{"DocType": "my_history", "time": "789546"}. 在这些新属性的帮助下,将可以创建索引并通过查询进行搜索。
    • 放置状态 丰富的 旧值加新键 my_record_<uniqueId>
  3. 如果key不存在,就把你的值和key一起放进去。my_record 而没有任何新的属性。

采用这种方法 my_record 键将始终保持最新值。你可以通过使用索引(或不使用,基于你的性能考虑)查询任何属性的历史记录,而不需要分页。

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

© www.soinside.com 2019 - 2024. All rights reserved.