在couchDB的数组字段上应用筛选器

在couchDB的数组字段上应用筛选器,couchdb,hyperledger-fabric,blockchain,hyperledger-chaincode,couchdb-mango,Couchdb,Hyperledger Fabric,Blockchain,Hyperledger Chaincode,Couchdb Mango,我正在研究Hyperledger结构。我需要数组中的特定值,而不是CouchDB中的完整文档 范例 { "f_id": "1", "History": [ { "amount": "1", "contactNo": "-", "email": "i2@mail.com" }, { "amount": "5", "contactNo": "-", "email": "i@gmail.com",

我正在研究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"
    } 
完整历史记录数组,但只需要历史记录数组的第一个对象。

有人能指引我吗


谢谢。

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

您可能需要重新考虑您的设计。例如,如果希望保存历史记录并从中查询,此方法可能会解决以下问题:

  • 获取特殊密钥的状态
    my_记录
  • 如果密钥存在:

    • 使用键
      my_record
      输入新值
    • 使用附加属性丰富旧值:
      {“DocType”:“my_history”,“time”:“789546”}
      。在这些新属性的帮助下,可以通过查询创建索引和搜索
    • PutState使用一个新键来丰富旧值
  • 如果密钥不存在,只需将您的值放入密钥
    my_record
    ,不带任何新属性

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


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

    好的,谢谢您的回复。但是我需要在一个数组中存储多个条目,并且只检索一个值。