subgraph中数组的储存


原谅我是个 graph sql 的菜鸟,近日在做一个批量转账的需求时, 需要将批量转账的信息上graph供前端查询,忽然才想到,每次转账的账号和金额信息,这些天然以熟组形式传递和计算的数据逻辑,是否能以熟组的形式存储呢?
遇事不决问google,果然是可以的

查看文章

这里面介绍了 在逻辑层,也就是一般是写在 mapping.ts 中的数据存储逻辑。
其中,重点提到了一段代码:
// This won't work
entity.numbers.push(BigInt.fromI32(1))
entity.save()
// This will work
let numbers = entity.numbers
numbers.push(BigInt.fromI32(1))
entity.numbers = numbers
entity.save()
在存储熟组时,往往需要循环压入数据,这段代码的意思是,如果直接在 entity对象压入,是不会存储成功的(已经测试过确实如此),需要先将熟组赋值给一个变量,然后再赋给entity对象。
其中也介绍了多维数据结构的存储分方式
type User @entity {
  id: ID!
  positions: [Position!]! @derivedFrom(field: user)
}
type Position @entity {
  id: ID!
  user: User! # This is the ID String of the User
}
有了这个代码示例,实际上对于任何复杂的存储需求都是可以满足的。
当然对我我这个需求来说,一次批量转账,可能是几十个,上百个,将这些event信息上graph,可能只需要一些一维数组就好了。附上数据结构的定义示例,我这里定义了一个地址数组,和一个转账金额数组:
type airDrop @entity {
  id: ID!
  name_: String!
  tokenAddressArr: [Bytes!]! # 地址数组
  tokenAmountArr: [BigInt!]! # 转账金额数组
}
tips: 其中在写代码逻辑的时候,还遇到了一个问题,就是传入的金额数据bigint数组是可以直接赋值给我实例化的entry对象tokenAmountArr的,但是event传入的address数组却无法直接赋值给 tokenAddressArr 对象,报错什么 array 的 Bytes对象和array的address不可以直接assign,但是我使用循环将address逐个压入然却是可以的。目前在graph定义的类方法里,没有找到这种情况直接赋值的好办法。