You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过JSON API查询Daml中的Map值?单键查询实现咨询

解决Daml中单个Map键查询返回空集的问题

这个问题我之前也碰到过——Daml默认对Map类型的查询是精确匹配整个Map结构,这就是为什么你传两个键能匹配到数据,只传一个键却不行:它在找完全只包含该键值对的Map,而不是包含该键值对的Map。下面给你两种场景的解决方案:

1. 在Daml脚本/REPL中查询

假设你的模板定义大概是这样的(对应你给出的示例数据):

module MyModule where

import Daml.Script
import DA.Map (Map)
import qualified DA.Map as Map

template MyTemplate
  with
    information : Text
    textMap : Map Text (Text, Text)
  where
    signatory []

之前你可能写了类似这样的精确匹配查询(这会返回空集,因为你的数据里还有Date键):

-- 错误写法:精确匹配整个Map,只有当textMap只有Type键时才会命中
query MyTemplate with textMap = Map.fromList [("Type", ("A", "B"))]

正确的做法是使用contains谓词,检查Map中是否包含指定的键值对,不管其他键的存在:

-- 正确写法:匹配所有textMap中包含("Type", ("A", "B"))键值对的模板实例
query MyTemplate where textMap `Map.contains` ("Type", ("A", "B"))

如果你只需要检查Type键存在(不管对应的值是什么),可以用elem结合keys函数:

query MyTemplate where "Type" `elem` Map.keys textMap

2. 通过JSON API查询

如果是通过Daml的JSON API进行查询,需要使用$contains操作符来替代精确匹配。注意Daml中的元组会被序列化为JSON数组,所以{"_1":"A", "_2":"B"}对应JSON的["A", "B"]。

示例请求体如下:

{
  "templateId": "MyModule:MyTemplate",
  "query": {
    "textMap": {
      "$contains": {
        "Type": ["A", "B"]
      }
    }
  }
}

如果只需要匹配Type键存在,JSON API目前没有直接的键存在查询,但你可以结合$exists操作符(需确保Daml版本支持),或者通过检查该键对应的值不为空(适用于键存在则值一定非空的业务场景)。

关键总结

  • Daml默认对Map的查询是精确匹配整个集合,而非部分匹配
  • 要实现部分匹配,必须使用contains(Daml代码)或$contains(JSON API)来指定要匹配的键值对
  • 根据需求选择匹配键值对,还是仅匹配键的存在

内容的提问来源于stack exchange,提问作者Logical Thinker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:58:09