如何通过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
相关产品推荐
相关产品推荐

