环境ogg 12.2.0
源库 :mysql
表结构: dh
 +-------+-------------+------+-----+-------------------+-------+
| Field | Type        | Null | Key | Default           | Extra |
+-------+-------------+------+-----+-------------------+-------+
| id    | int(11)     | NO   | PRI | NULL              |       |
| name  | varchar(50) | YES  |     | NULL              |       |
| dt    | datetime    | YES  |     | CURRENT_TIMESTAMP |       |
+-------+-------------+------+-----+-------------------+-------+
源端配置 抽取进程 extract 并且 pump 到目标端的对应目录目标:mongo
参数文件:
[root@host1 ggs]# cd ./dirprm
[root@host1 dirprm]# ls
mgr.prm  mongo.props  rmongo.prm
[root@host1 dirprm]# more mongo.propsgg.handlerlist=mongodbgg.handler.mongodb.type=oracle.goldengate.delivery.handler.mongodb.MongoDBHandler
gg.handler.mongodb.clientURI=mongodb://localhost:27017/
#gg.handler.mongodb.clientURI=mongodb://ogg:ogg@localhost:27017/?authSource=admin&authMechanism=SCRAM-SHA-1gg.handler.mongodb.mode=txgoldengate.userexit.timestamp=utc
goldengate.userexit.writers=javawriter
javawriter.stats.display=TRUE
javawriter.stats.full=TRUEgg.log=log4j
gg.log.level=DEBUGgg.report.time=30sec##CHANGE THE PATH BELOWgg.classpath=/ggs/lib/mongo-java-driver-3.2.2.jar:/ggs/mongo/bin/ogg-mongodb-adapter-1.0.jar:
javawriter.bootoptions=-Xmx512m -Xms32m -Djava.class.path=ggjava/ggjava.jar:
[root@host1 dirprm]# more rmongo.rpm
rmongo.rpm: No such file or directory
[root@host1 dirprm]# more rmongo.prm
REPLICAT rmongo
-- Trail file for this example is located in "AdapterExamples/trail" directory
-- Command to add REPLICAT
-- add replicat rmongo, exttrail AdapterExamples/trail/tr
TARGETDB LIBFILE libggjava.so SET property=dirprm/mongo.props
REPORTCOUNT EVERY 1 MINUTES, RATE
GROUPTRANSOPS 10000MAP test.dh, TARGET test.dh;问题:
 表dh的同步实现了,但是mongo里的collection字段全变成 string 类型了, 包括datetime 和 int。请问如何解决这个类型强制被转换的问题。

解决方案 »

  1.   

     // 获取到mongodb的文件信息
                Document document = new Document(getFormattedData(tableMetaData, op, false, false).getMap());            // 修改字段数据类型
                ArrayList<ColumnMetaData> col =  tableMetaData.getColumnMetaData();
                for (ColumnMetaData columnMetaData : col){
                    if ("NUMERIC".equals(columnMetaData.getDataType().toString())){
                        String filed  = document.getString(columnMetaData.getColumnName());
                        if (filed != null){
                            if (!"NULL".equals(filed)){
                                Double amount = Double.valueOf(filed);
                                document.put(columnMetaData.getColumnName(),amount);
                            }
                        }                }
                }