MongoDB文档对象字段属性合并的2种转换方法

现在,对MongoDB中文档对象冗余数据有中业务要求,就是对同种属性的字段进行合并成一个集合,效果如下图所示:


实现上述数据转换有2中方法:一种是基于NoSQL语言的实现方式,一种是基于kettle的业务数据转换。

1、基于NoSQL语言的实现方式

首先,在MongoDB里准备一个文档数据:

[mongo@mongo ~]$ mongo

MongoDB shell version: 3.2.7

connecting to: test

> show dbs

local  0.000GB

zhul   0.151GB

> use datatrans

switched to db datatrans

> db.datatrans.insert({"username":"hanlingsha","gender":"girl","age":17,"TEL1":18811223298,"TEL2":18581418158,"TEL3":15286856439});

WriteResult({ "nInserted" : 1 })

> db.datatrans.findOne({"username":"hanlingsha"});

{

         "_id" : ObjectId("5760ad43742ee65d9552e757"),

         "username" : "hanlingsha",

         "gender" : "girl",

         "age" : 17,

         "TEL1" : 18811223298,

         "TEL2" : 18581418158,

         "TEL3" : 15286856439

}

>

         使用NoSQL语句实现文档元素合并的数据转换:

> var hls= db.datatrans.findOne({"username":"hanlingsha"});

> hls.username=hls.username;

hanlingsha

> hls.gender=hls.gender;

girl

> hls.age=hls.age;

17

> hls.TEL=[hls.TEL1,hls.TEL2,hls.TEL3];

[ 18811223298, 18581418158, 15286856439 ]

> delete hls.TEL1;

true

> delete hls.TEL2;

true

> delete hls.TEL3;

True

> db.datatrans.update({"username":"hanlingsha"},hls);

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.datatrans.findOne({"username":"hanlingsha"});

{

         "_id" : ObjectId("5760b2d8a1eb8f1a472e6980"),

         "username" : "hanlingsha",

         "gender" : "girl",

         "age" : 17,

         "TEL" : [

                   18811223298,

                   18581418158,

                   15286856439

         ]

}

>

         这里示例的是单个文档的转换,如果要转换多个文档,可以采用for循环;下边示例是使用kettle工具实现文档属性字段合并的数据转换:

先使用MongoChref连接上MongoDB


现在,我们从datatrans集合往dataresult集合抽取数据,并实现数据转换:

转换输入连接设置


转换输入源设置


输入源设置完成后可以点击预览查看要抽取的原始数据

 

调整输入源的fileds字段域设置获取源文档的字段域


整理编辑要选择的字段域,删除_id,因为输入步骤中会自动生成_id


输入的连接设置


输入的数据库及集合选择设置


输入前的转换设置


点击执行转换任务


切换到MongChref查看转换结果:


顺利完成,另外,kettle可以实现多文档转换,还能并行^_^

请使用浏览器的分享功能分享到微信等