现在,对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可以实现多文档转换,还能并行^_^!