Mule SQL连接的Dataweave等价物

Mule SQL连接的Dataweave等价物,mule,dataweave,Mule,Dataweave,如何在Dataweave中实现SQL连接的等效功能?我基本上实现了一个查找。我在流变量中有CSV数据和JSON数据。我可以同时使用它们,但我不知道如何连接它们。假设CSV有两列: Name,ExternalId Foo,1 Bar,2 Baz,2 JSON数据是: { ExternalEntities: [ { "Id": 1, "Name": "One", "Description": "Thing One" } , { "Id": 2, "Name":

如何在Dataweave中实现SQL连接的等效功能?我基本上实现了一个查找。我在流变量中有CSV数据和JSON数据。我可以同时使用它们,但我不知道如何连接它们。假设CSV有两列:

Name,ExternalId
Foo,1
Bar,2
Baz,2
JSON数据是:

{
    ExternalEntities: [
        { "Id": 1, "Name": "One", "Description": "Thing One" }
      , { "Id": 2, "Name": "Two", "Description": "Thing Two" }
    ]
}
最后,我想要一个包含以下内容的
列表(为了方便起见,这里用JSON格式表示)


下面是一个示例,使用json作为有效负载,使用csv作为查找表。第一个流解析json,并通过“Id”作为有效负载进行流查找。第二个流将csv作为数组加载,并根据传入的Id进行搜索。这将返回找到的CSV记录的映射,您可以在其中提取“名称”字段

可以在一个变压器中执行此操作,但为了演示起见,这更容易。如果希望csv作为有效负载,json作为查找,还可以通过一些修补来反转查找

    <flow name="lookuptest" processingStrategy="synchronous">
        <poll doc:name="Poll">
            <logger level="INFO" doc:name="Logger" />
        </poll>

        <set-payload
            value="{ &quot;ExternalEntities&quot;: [ { &quot;Id&quot;: 1, &quot;Name&quot;: &quot;One&quot;, &quot;Description&quot;: &quot;Thing One&quot; } , { &quot;Id&quot;: 2, &quot;Name&quot;: &quot;Two&quot;, &quot;Description&quot;: &quot;Thing Two&quot; } ] }"
            doc:name="Set Payload"  mimeType="application/json"></set-payload>

        <dw:transform-message doc:name="Transform Message">
            <dw:input-payload doc:sample="string_2.dwl" />
            <dw:set-payload><![CDATA[%dw 1.0
%input payload application/json
%output application/json
---
payload.ExternalEntities map ((value , index) -> {
    Name: lookup("NameLookup", [value.Id as :string]).Name
})]]></dw:set-payload>
        </dw:transform-message>

        <object-to-string-transformer doc:name="Object to String"/>

        <logger level="ERROR" message="#[payload]" doc:name="Logger"/>
    </flow>
    <flow name="NameLookup" processingStrategy="synchronous">
        <set-variable value="#[payload[0]]" variableName="ExternalId"
            doc:name="Variable" />

        <set-payload
            value="#[Thread.currentThread().getContextClassLoader().getResourceAsStream('lookuptables/namelookup.csv')]"
            mimeType="application/csv" doc:name="Variable" />

        <dw:transform-message doc:name="Transform Message">
            <dw:input-payload doc:sample="string_2.dwl" />
            <dw:set-payload><![CDATA[%dw 1.0
%input payload application/csv
%output application/java
---
(payload[?($.ExternalId == flowVars['ExternalId'])])[0]
]]></dw:set-payload>
        </dw:transform-message>

    </flow>

{
名称:查找(“名称查找”,[value.Id as:string])。名称
})]]>

这里有第二个可行的解决方案,尽管我接受了@Ryan Carter的答案

%dw 1.0
%output application/json
---

flowVars.myCsv map (
  (row0, i) -> using (lookupElement = (flowVars.jsonLookup.ExternalEntities filter ((obj1) -> row0.ExternalId ~= obj1.Id))[0]) {
      Name: row0.Name
    , ExternalName: lookupElement.Name
    , ExternalDescription: lookupElement.Description
  } mapObject ({"$$": $, (StartsWithB:$[0] == "B") when $$ ~= "Name"})
)

Ryan,经过一些调查,我最终尝试了另一种方法,但我接受你的答案,因为这是“官方”的方式。最后,我没有使用DataWeave进行合并,因为考虑到我拥有的数据的大小,合并花费的时间太长了。
%dw 1.0
%output application/json
---

flowVars.myCsv map (
  (row0, i) -> using (lookupElement = (flowVars.jsonLookup.ExternalEntities filter ((obj1) -> row0.ExternalId ~= obj1.Id))[0]) {
      Name: row0.Name
    , ExternalName: lookupElement.Name
    , ExternalDescription: lookupElement.Description
  } mapObject ({"$$": $, (StartsWithB:$[0] == "B") when $$ ~= "Name"})
)