我想为Hyperledger Composer应用编写特定的查询。下面,我有2个资产和一个交易。 Asset1
有一个名为contents
的字段,该字段是Asset2
类型的数组。相关代码如下:
namespace org.acme.biznet
asset Asset1 identified by Asset1Id {
o String Asset1Id
--> Asset2[] contents
}
asset Asset2 identified by Asset2Id {
o String Asset2Id
}
transaction Transact {
--> Asset1 asset1
}
我想选择Transact
的所有实例,其中关联的Asset1
内部指定了Asset2
。我得到的解决方案最接近的是下面的查询,但是没有用。
query GetTransactionsThatHaveAsset2 {
description: ""
statement:
SELECT org.acme.biznet.Transact
WHERE (asset1.contents CONTAINS (Asset2Id == _$propId))
}
问题是,我也在下面写了查询。
query GetAsset1sThatHaveAsset2 {
description: ""
statement:
SELECT org.acme.biznet.Asset1
WHERE (contents CONTAINS (Asset2Id == _$propId))
}
此查询的行为符合预期,但它选择Asset1
。我想选择Transact
。我该如何撰写此查询?
答案 0 :(得分:2)
不,你现在无法像你提议的那样嵌套查询,嵌套的命名查询当前没有在Composer中实现(CouchDB不是关系数据库,因此Composer查询语言无法翻译目前要翻译的嵌套查询to CouchDB)2)Transact
是一个事务 - 它包含您在模型中定义的关系标识符,而不是存储在相关资产中的嵌套数据。您必须定义一个查询,搜索与您传递给trxn的asset1
标识符字段匹配的所有事务 - 然后在您的代码中,您可以检查transact.asset1.contents
包含'某事'(传入trxn也是?)使用javascript匹配 - 相当简单)。或者,您可以使用REST API过滤器(环回过滤器而不是查询),其中(形成您的应用程序代码)您可以使用带有过滤器的REST调用来解析事务(Transact)与asset1(及其内容)之间的关系,例如{ {1}}。希望这会有所帮助,也许它的嵌套你只是在寻找..
答案 1 :(得分:0)
就我而言,我拥有这些资产
// Define assets
asset Product identified by productId {
o String productId
o String description
o String serialNumber
o String modelNumber
o String status // TRANSFERED, RECEIVED, RECLAMED
o DateTime joinTime
--> Trader previousOwner
--> Trader currentOwner
--> Trader newOwner
}
// Trade, moves product from to a new owner.
transaction Trade {
--> Product product
--> Trader newOwner
o String trade_type
}
执行贸易交易会产生以下记录:
{
"$class": "org.sp.network.Trade",
"product": "resource:org.sp.network.Product#123",
"newOwner": "resource:org.sp.network.Trader#6694",
"trade_type": "Trade",
"transactionId": "e39a86ed4748a3ab73b5e9c023f6bb0ca025098af09b8b5b2dca8f5f7ef0db67",
"timestamp": "2019-06-13T12:04:20.180Z"
}
要查询包含产品的所有贸易交易是
query ProductPath{
description: "Selete all Trade transactions for a specific ProductId"
statement:
SELECT org.sp.network.Trade
WHERE (_$productId==product)
}
使用其余服务器:_$productId
的值为resource:org.sp.network.Product#123