Mule Mongo 连接器产生 INNER JOIN 结果

Mule Mongo Connector to produce INNER JOIN results

我有两个集合,一个是组织,一个是组织内的品牌,我正在尝试生成一个结果集,使与组织相关的品牌显示为嵌套 JSON组织内部 JSON 结果。

获取结果的代码如下所示,它确实 return 了预期的结果,但是最后的 JSON 中每个布拉德都有引号。如何在不将其作为字符串包含的情况下包含品牌的 JSON?

通过来自 Mongo 的 Mongo ID 查询单个组织:

    <mongo:find-one-object-using-query-map config-ref="mdb_config" collection="orgs" doc:name="Fetch object from Mongo">
        <mongo:query-attributes>                
            <mongo:query-attribute key="_id">#[new org.bson.types.ObjectId(flowVars.OrgId)]</mongo:query-attribute>
        </mongo:query-attributes>
    </mongo:find-one-object-using-query-map>
    <mongo:db-object-to-map doc:name="Map Mongo object to hashmap"/>

查询组织品牌列表:

    <foreach collection="#[payload.brands]" doc:name="For Each" rootMessageVariableName="rootMessage">
        <mongo:find-one-object-using-query-map config-ref="mdb_config" collection="brands" doc:name="Fetch brands for org">
            <mongo:query-attributes>                
                <mongo:query-attribute key="_id">#[new org.bson.types.ObjectId(message.payload)]</mongo:query-attribute>
            </mongo:query-attributes>
        </mongo:find-one-object-using-query-map >

        <!-- Transform the brand from Mongo to JSON schema compliant JSON -->
            <scripting:transformer doc:name="Map Mongo object to JSON">
                <scripting:script engine="Groovy"><![CDATA[
                     def builder = new groovy.json.JsonBuilder()
                     def root = builder {
                         brandId payload._id.toString()
                         //...
                         isActive payload.platformHeader.isActive
                     }
                     return builder.toPrettyString();
                 ]]></scripting:script>
            </scripting:transformer>
        <expression-component>brandResponses.add(message.payloadAs(java.lang.String))
        </expression-component>
        <logger message="The result is #[message.payloadAs(java.lang.String)]"  level="INFO" doc:name="Logger"/>
    </foreach> 
    <logger level="INFO" message="#[brandResponses]"/>
            <!-- Transform the org from Mongo to JSON schema compliant JSON -->
    <scripting:transformer doc:name="Map Mongo object to JSON">
        <scripting:script engine="Groovy"><![CDATA[
           def brandsPayload = flowVars.brandResponses
            def builder = new groovy.json.JsonBuilder()
            def root = builder {
                orgId payload._id.toString()
                //...
                isActive payload.platformHeader.isActive
                brands(brandsPayload.collect {it})
            }
            return builder.toPrettyString();
        ]]></scripting:script>
    </scripting:transformer>

结果JSON

{
    "orgId": "5565f305b85c31182a65a6a7",
    "isActive": true,
    "brands": [
        "{
        "brandId": "5565f2ff03758e0c189a753d",
        "isActive": true
        }",
        "{
        "brandId": "5565f2ff03758e0c189a7594",
        "isActive": true
        }"
    ]
}

问题出在您将品牌的字符串表示形式存储在 brandResponses 中,因此您将它们作为字符串收集在最后的 JSON.

请注意,对于生成 JSON,使用 Groovy 并没有太大的好处。使用 MEL 构建 Maps/Lists 并使用 json:object-to-json-transformer 将它们序列化为 JSON Objects/Arrays 要容易得多(作为比较,Grooxy 对于 XML 代会更容易)。

无论如何,要解决您的问题:

  • 去掉第一个scripting:transformer
  • 替换表达式组件以在地图而不是字符串中存储品牌,使用:brandResponses.add(["brandId":payload._id.toString(), "isActive":payload.platformHeader.isActive])

我认为应该这样做。如果不是,您可能需要查看 collect 闭包以正确生成 JSON。

每个操作的最新版本MongoDb connector (v4.2.0) is very different than previous versions. Input and Output formats are different

我在将 Document 对象转换为 JSON json:object-to-json-transformer

时遇到了类似的问题

解决方案类似:在将 org.bson.Document 对象转换为 JSON

之前,将 expression-component 放入以下代码
payload.append("id",payload.getObjectId("_id").toString())

Document.append() 方法 return 返回更新的文档对象。

希望对您有所帮助。