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 返回更新的文档对象。
希望对您有所帮助。
我有两个集合,一个是组织,一个是组织内的品牌,我正在尝试生成一个结果集,使与组织相关的品牌显示为嵌套 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 返回更新的文档对象。
希望对您有所帮助。