对couchDB的数组字段应用过滤器

t9eec4r0  于 2022-12-09  发布在  CouchDB
关注(0)|答案(1)|浏览(189)

我正在处理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“对象在history数组上,而不是完整的History数组。
芒果查询:

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

完整历史数组,但仅需要历史数组的第一个对象。

有谁能给我指路吗?

  • 谢谢-谢谢
icnyk63a

icnyk63a1#

我认为这是不可能的,因为富查询是根据给定的选择器检索完整的记录(键-值对)。
您可能需要重新考虑您的设计。例如,如果您要保存历史记录并从中进行查询,则此方法可能会产生以下效果:
1.获取特殊密钥的状态my_record

  • 如果密钥存在:
  • PutState键为my_record新值
  • 使用其他属性丰富旧值:{"DocType": "my_history", "time": "789546"}。在这些新属性的帮助下,可以创建索引并通过查询进行搜索。
  • PutState * 用新键my_record_<uniqueId>充实 * 旧值
  • 如果key不存在,只需将您的值与key my_record放在一起,而不添加任何新属性。

通过这种方法,my_record键将始终保存最新值。您可以使用索引(或不使用索引,取决于您的性能问题)来查询任何不带/不带分页的属性的历史记录。
这种方法也将是一种占用空间较少的方法。因为如果你在单个键上累积历史记录,现有的历史记录每次都会被复制到下一个版本,这意味着你的每个条目都将占用previous_size + delta,而不仅仅是delta

相关问题