Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何使用Mule丰富有效负载并将对象插入MongoDB_Json_Mongodb_Mule - Fatal编程技术网

Json 如何使用Mule丰富有效负载并将对象插入MongoDB

Json 如何使用Mule丰富有效负载并将对象插入MongoDB,json,mongodb,mule,Json,Mongodb,Mule,我的骡子流中有一条消息enricher,如下所示: <set-variable doc:name="Variable" value="#[payload['MeterUID']]" variableName="#['theKey']"/> <enricher target="#[payload]" doc:name="Message Enricher"> <mongo:find-objects-using-query-map config-ref="Mong

我的骡子流中有一条消息enricher,如下所示:

<set-variable doc:name="Variable" value="#[payload['MeterUID']]" variableName="#['theKey']"/>
    <enricher target="#[payload]" doc:name="Message Enricher">
<mongo:find-objects-using-query-map config-ref="Mongo_DB1" collection="meterentity" doc:name="Mongo DB">
    <mongo:query-attributes>
                <mongo:query-attribute key="_id">#[theKey]</mongo:query-attribute>
    </mongo:query-attributes>
    <mongo:fields>
        <mongo:field>IpAddress</mongo:field>
        <mongo:field>LastSetTime</mongo:field>
        <mongo:field>LastReadGsmData</mongo:field>
    </mongo:fields>
</mongo:find-objects-using-query-map>
[ { "_id" : "4B414D000000011613CC" , "IpAddress" : "10.12.189.12" , "LastSetTime" : { "$date" : "2014-03-11T14:40:36.987Z"} , "LastReadGsmData" : { "$date" : "2014-03-11T14:40:47.253Z"}}]
在Mongo集合中,我的有效负载如下所示:

<set-variable doc:name="Variable" value="#[payload['MeterUID']]" variableName="#['theKey']"/>
    <enricher target="#[payload]" doc:name="Message Enricher">
<mongo:find-objects-using-query-map config-ref="Mongo_DB1" collection="meterentity" doc:name="Mongo DB">
    <mongo:query-attributes>
                <mongo:query-attribute key="_id">#[theKey]</mongo:query-attribute>
    </mongo:query-attributes>
    <mongo:fields>
        <mongo:field>IpAddress</mongo:field>
        <mongo:field>LastSetTime</mongo:field>
        <mongo:field>LastReadGsmData</mongo:field>
    </mongo:fields>
</mongo:find-objects-using-query-map>
[ { "_id" : "4B414D000000011613CC" , "IpAddress" : "10.12.189.12" , "LastSetTime" : { "$date" : "2014-03-11T14:40:36.987Z"} , "LastReadGsmData" : { "$date" : "2014-03-11T14:40:47.253Z"}}]
我觉得这是不对的。首先,我的第一个有效载荷去了哪里? 第二,当流tryes插入到我的mongodb中时,我得到了这个错误:

Exception stack is:
1. BasicBSONList can only work with numeric keys, not: [_id] (java.lang.IllegalArgumentException)
  org.bson.types.BasicBSONList:161 (null)
2. Failed to invoke insertObject. Message payload is of type: String 
我怎样才能做到这一点? 我还是个新手,所以我希望你们能在这里帮助我

我的整个流程:

    <?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:vm="http://www.mulesoft.org/schema/mule/vm" xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:mulexml="http://www.mulesoft.org/schema/mule/xml" xmlns:mongo="http://www.mulesoft.org/schema/mule/mongo" xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:data-mapper="http://www.mulesoft.org/schema/mule/ee/data-mapper" xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.4.1"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd
http://www.mulesoft.org/schema/mule/ee/data-mapper http://www.mulesoft.org/schema/mule/ee/data-mapper/current/mule-data-mapper.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd
http://www.mulesoft.org/schema/mule/mongo http://www.mulesoft.org/schema/mule/mongo/2.0/mule-mongo.xsd
http://www.mulesoft.org/schema/mule/xml http://www.mulesoft.org/schema/mule/xml/current/mule-xml.xsd
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd
http://www.mulesoft.org/schema/mule/vm http://www.mulesoft.org/schema/mule/vm/current/mule-vm.xsd">
    <data-mapper:config name="csv_to_xml_7" transformationGraphPath="csv_to_xml_7.grf" doc:name="csv_to_xml_7"/>
    <data-mapper:config name="csv_to_xml_8" transformationGraphPath="csv_to_xml_8.grf" doc:name="csv_to_xml_8"/>
    <mongo:config name="Mongo_DB" username="$[admin]" doc:name="Mongo DB">
        <mongo:connection-pooling-profile initialisationPolicy="INITIALISE_ONE" exhaustedAction="WHEN_EXHAUSTED_GROW"/>
    </mongo:config>
    <mongo:config name="Mongo_DB1" username="$[admin]" doc:name="Mongo DB">
        <mongo:connection-pooling-profile initialisationPolicy="INITIALISE_ONE" exhaustedAction="WHEN_EXHAUSTED_GROW"/>
    </mongo:config>
    <data-mapper:config name="xml_to_json_2" transformationGraphPath="xml_to_json_2.grf" doc:name="xml_to_json_2"/>
    <data-mapper:config name="xml_to_json_3" transformationGraphPath="xml_to_json_3.grf" doc:name="xml_to_json_3"/>
    <mongo:config name="Mongo_DB2" username="$[admin]" doc:name="Mongo DB">
        <mongo:connection-pooling-profile initialisationPolicy="INITIALISE_ONE" exhaustedAction="WHEN_EXHAUSTED_GROW"/>
    </mongo:config>
    <flow name="p2pcontrollerloganalyserFlow1" doc:name="p2pcontrollerloganalyserFlow1">
        <file:inbound-endpoint path="C:\Users\Simon\Desktop\CSVFile" responseTimeout="10000" doc:name="File" moveToDirectory="C:\Users\Simon\Desktop\CSVPros" />
        <byte-array-to-string-transformer doc:name="Byte Array to String"/>
        <choice doc:name="Choice">
            <when expression="#[message.outboundProperties.originalFilename=='gsmdata.log']">
                <data-mapper:transform config-ref="csv_to_xml_7" doc:name="GSMV1 to xml"/>
                <splitter expression="#[xpath('//Root')]" doc:name="Splitter"/>
                <mulexml:dom-to-xml-transformer doc:name="DOM to XML"/>
                <data-mapper:transform config-ref="xml_to_json_2" doc:name="XML To JSON"/>
                <byte-array-to-string-transformer doc:name="Byte Array to String"/>
                <vm:outbound-endpoint exchange-pattern="one-way" path="json1" doc:name="VM"/>
            </when>
            <when expression="#[message.outboundProperties.originalFilename=='gsmdatav2.log']">
                <data-mapper:transform config-ref="csv_to_xml_8" doc:name="GSMV2 to XML"/>
                <splitter expression="#[xpath('//Root')]" doc:name="Splitter"/>
                <mulexml:dom-to-xml-transformer doc:name="DOM to XML"/>
                <data-mapper:transform config-ref="xml_to_json_3" doc:name="XML To JSON"/>
                <byte-array-to-string-transformer doc:name="Byte Array to String"/>
                <vm:outbound-endpoint exchange-pattern="one-way" path="json2" doc:name="VM"/>
            </when>
            <otherwise>
                <file:outbound-endpoint path="C:\Users\Simon\Desktop\CSVFile" responseTimeout="10000" doc:name="Failed GSM"/>
            </otherwise>
        </choice>
    </flow>
    <flow name="json1persistent" doc:name="json1persistent">
        <vm:inbound-endpoint exchange-pattern="one-way" path="json1" doc:name="VM"/>
        <json:json-to-object-transformer returnClass="java.lang.Object" doc:name="JSON to Object"/>
        <set-variable doc:name="Variable" value="#[payload['MeterUID']]" variableName="#['theKey']"/>
        <enricher target="#[payload]" doc:name="Message Enricher">
    <mongo:find-objects-using-query-map config-ref="Mongo_DB1" collection="meterentity" doc:name="Mongo DB">
        <mongo:query-attributes>
                    <mongo:query-attribute key="_id">#[theKey]</mongo:query-attribute>
        </mongo:query-attributes>
        <mongo:fields>
            <mongo:field>IpAddress</mongo:field>
            <mongo:field>LastSetTime</mongo:field>
            <mongo:field>LastReadGsmData</mongo:field>
        </mongo:fields>
    </mongo:find-objects-using-query-map>
</enricher>
        <mongo:mongo-collection-to-json doc:name="Mongo DB"/>
        <mongo:insert-object config-ref="Mongo_DB2" collection="GSMdata" doc:name="Mongo DB"/>
        <!-- <foreach collection="#[payload]" doc:name="For Each">
            <mongo:insert-object config-ref="Mongo_DB" collection="GSMdata" doc:name="Mongo DB"/>
        </foreach> --> 
        <!--  <enricher doc:name="Message Enricher">
            <mongo:get-file-content config-ref="Mongo_DB" query-ref="#[payload['MeterUID']]" doc:name="Find Meter"/>
        </enricher>-->
    </flow>
</mule>

#[钥匙]
IP地址
最后一次
LastReadGsmData
我打算读取一个CSV文件,将其拆分成更小的消息,用来自MongoDB的数据丰富每条消息,最后将每条消息插入另一条MongoDB

首先,我的第一个有效载荷去了哪里

enricher target=“#[有效载荷]”
表示您正在将当前有效载荷设置为enricher返回的值。您确实希望目标是其他对象,例如变量:
target=“#[variable:myVar]”

第二,当流tryes插入到我的 蒙哥达

您没有在此处共享任何相关配置,但我猜您现在正在将查询的Mongo对象列表发送给某个需要单个Map对象的组件。请参考您的第一个问题

如果您的目标是将查询的Mongo对象中的字段添加到当前有效负载中,那么应该使用一个变量作为充实目标,如上面的示例所示。然后,您可以稍后组合有效负载和包含Mongo对象的丰富变量

此外,如果您仅从Mongo获取单个对象,则可以使用enricher组件中的
source=“#[payload.toArray()[0]]”
之类的方法从Mongo列表中提取它

由于您的有效负载和myVar变量现在都是Java映射,您可以将它们与普通Java结合使用:

<expression-component doc:name="Expression">payload.putAll(myVar)</expression-component>
payload.putAll(myVar)
如果您想删除Mongo返回的_id字段,可以使用

<expression-component doc:name="Expression">payload.remove('_id')</expression-component>
payload.remove(“\u id”)
编辑:既然您的有效负载是一个映射,您可以使用

<mongo:insert-object-from-map config-ref="Mongo_DB2" collection="GSMdata">
   <mongo:element-attributes ref="#[payload]"/> 
</mongo:insert-object-from-map>


用插入部分更新了我的答案。请阅读我对enricher源/目标属性的说明,然后将enricher后面的两个组件替换为上述两个表达式组件和映射插入。我得到一个错误,因为出于某种原因,负载在我的Json to对象之后是linkedhashmap。为什么?以及如何修复?如果这与正确配置enricher组件无关,请创建一个新问题。此外,始终包含错误的完整stacktrace,在本例中,还可以使用Logger打印json,因为我们无法猜测您的DataMapper组件正在生成什么样的数据。更好的是,如果你能将你的问题限制在流程中的一个特定阶段,并用一个特定的输入和尽可能少的组件重现它。