2015-06-14 28 views
1

我有两个集合,一个组织和组织中的品牌之一,我试图产生一个结果集,将与组织相关的品牌显示为在组织JSON结果中嵌套JSON。Mule Mongo连接器产生INNER JOIN结果

获取结果的代码如下所示,它确实返回了预期的结果,但最终的JSON在每个brad中都有引号。如何将品牌的JSON包含在字符串中?

查询的单个组织通过蒙戈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 
     }" 
    ] 
} 

回答

1

问题来自于你存储brandResponses中品牌的字符串表示,因此你在最终的JSON中将它们作为字符串收集起来。

请注意,对于生成JSON,使用Groovy没有什么大的收获。使用MEL构建Maps/Lists并将它们序列化为JSON Objects/Arrays与json:object-to-json-transformer相比更容易(作为比较,Groxy对于XML生成会更容易)。

在任何情况下,要解决你的问题:

  • 除去第一scripting:transformer
  • 替换表达式成分储存在地图不是字符串品牌,具有:brandResponses.add(["brandId":payload._id.toString(), "isActive":payload.platformHeader.isActive])

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

+0

感谢大卫,工作 – nmanela

+0

感谢大卫,您的答案是真正有用的,同时构建解决方案与最新的Mongo DB连接器v4.2.0类似的问题(下面回答) – PankajChandankar

1

最新版本的MongoDb connector (v4.2.0)与以前的版本有很大不同。每个操作使用Input and Output formats are different

我正面临同样的问题,而文档对象转换成JSON json:object-to-json-transformer

解决方案是相似的:把expression-component下面代码org.bson.Document对象转换为JSON

payload.append("id",payload.getObjectId("_id").toString()) 

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

enter image description here

希望这有助于。