MongoDB 数据导入
一、数据导入
基础准备:
1.显示mongoimport的帮助信息
>D:\mongo\bin>mongoimport -h
或>D:\mongo\bin>mongoimport –help
2.清除集合所有数据。
>db.test.drop()
控制台返回true
表示成功移除test数据库下的test集合。
>db.aaa.drop()
控制台返回false
表示不能成功移除test数据库下的aaa集合(因为不存在aaa集合)。
举个例子作为切入口:(先讲例子,再归纳命令符用法细节)
例子1:
需求:将数据文件things.dat导入到数据库abc的test_things集合
D:\mongo\bin>mongoimport -d abc -c test_things d:\mongo_data\things.dat
cmd控制台返回导出的相关信息,如下所示
connected to: 127.0.0.1
Mon Dec 09 18:28:06.061 check 9 15
Mon Dec 09 18:28:06.061 check imported 15 objects
解析:
* mongoimport --db
简写 mongoimport -d
指定导入数据于哪个数据库
(不能单独使用,至少须指定集合名,否则报错:“no collection specified!”)
* mongoimport --collection
简写 mongoimport -c
指定导入数据于哪个集合
eg:
>D:\mongo\bin>mongoimport -c test
(单独写没意义,至少指定导入的数据文件路径)
* mongoimport --file
没有简写的。
指定数据文件的路径。
注意:将该路径放置于mongoimport命令的最后的位置,可以省略—file标识的。
eg:
>D:\mongo\bin>mongoimport -c test --file d:\mongo_data\things.dat
或>D:\mongo\bin>mongoimport -c test -file d:\mongo_data\things.dat
或>D:\mongo\bin>mongoimport -c test d:\mongo_data\things.dat
(这条命令已经具有意义了,意思是往test数据库的test集合导入数据,数据文件来源于d:\mongo_data\things.dat。在无指定-d参数时,默认选用test数据库,至于test集合是否存在于test数据库是没关系的,不存在时系统自己会创建的。)
例子2:
需求:我修改了d:\mongo_data\things.dat数据文件中的数据,然后我要将这些数据再次导入到test数据库中的test集合(相同id的给我更新操作,不相同id的给我新增数据)。
eg:
>D:\mongo\bin>mongoimport -d test -c test --file d:\mongo_data\things.dat
显示了错误的信息如下:
E110000 duplicate key error index....,其实就是出现重复键了,违反了主键或者相关索引的约束了。
为了让具有相同主键或者唯一索引的文档,我们做一个更新操作,而不是试图去重复添加。
eg:
>D:\mongo\bin>mongoimport -d test -c test --file d:\mongo_data\things.dat --upsert
或>D:\mongo\bin>mongoimport -d test -c test --file d:\mongo_data\things.dat -upsert
解析:
* mongoimport --upsert
没有简写。
指定对数据源进行更新或添加数据,更新那些具有相同主键或者相同索引约束的文档,否则就新增文档操作。
(当然单独写无意义的,否则报错:“no collection specified!”)
例子3:
我现在要求在数据库没有连接上的情况下,进行数据的导入。将d:\mongo_data\things.dat数据文件中的数据,导入到test数据库中的test1集合。
eg:
>D:\mongo\bin>mongoimport --dbpath d:\data\db -d test -c test1 -file d:\mongo_data\things.dat
控制台反馈信息如下:
Tue Dec 10 11:40:08.343 [tools] check 9 15
Tue Dec 10 11:40:08.343 [tools] imported 15 objects
......
最后检验一下,先重新连接数据库,再查看test数据库的test1集合是否已插入数据。
实际上是操作是成功的。
解析:
* mongoimport --dbpath
没有简写的。
指定数据库文件,可以在非连接状态下,导入数据。
eg:
>D:\mongo\bin>mongoimport --dbpath d:\data\db -d test -c test1 -file d:\mongo_data\things.dat
或>D:\mongo\bin>mongoimport -dbpath d:\data\db -d test -c test1 -file d:\mongo_data\things.dat
注意:
当数据库已处于连接状态下,还使用 mongoimport –dbpath命令会提示如下信息:
if you are running a mongod on the same path you should connect to that instead of direct data file access.意思大概就是已经连接上就没必要再通过指向数据文件来达到操作数据库目的。
例子4:
需求:我要导入csv格式数据文件,并导入到test数据库的test1集合中。
导读:csv数据是常用的数据交互格式,相当于json一样,广泛应用与不同程序之间的数据交换,可以用excell打开,注意的地方是,不是将导出的数据文件后缀从.dat改成.csv就理解成已经将.dat文件换成成csv格式的文件,这个跟后缀没关系,主要是看你导出数据的设置要声明导出后的文件是csv类型,如:
D:\mongo\bin>mongoexport -d test -c things -csv -f uid,name,age -o d:\mongo_data\things_2.dat
或D:\mongo\bin>mongoexport -d test -c things --csv -f uid,name,age -o d:\mongo_data\things_2.dat
打开 d:\mongo_data\things_2.dat显示如下:
uid,name,age
,,
,,
,,
,,
,,
,,
,,
,,
,,
,"jimvin","[ 7, 9 ]"
,"tom","[ 7, 8, 9 ]"
,"jim",
,"person1",
,"person1",
,"person1",
说明,为什么有些地方是空的,因为我的test数据库的things集合的文档并不都具有uid,name,age字段的,这正是文档型数据库的特征,不要求数据都具有相同的数据字段。
eg:
>D:\mongo\bin>mongoimport -d test -c test1 -type csv --headerline -file d:\mongo_data\things_2.dat
或
>D:\mongo\bin>mongoimport -d test -c test1 -type csv -headerline -file d:\mongo_data\things_2.dat
解析:
* mongoimport --csv(导出数据部分)
没有简写的。
将导出数据文件的格式改为csv,以替代默认的json格式。
eg:
D:\mongo\bin>mongoexport -d test -c things -csv -f uid,name,age -o d:\mongo_data\things_2.dat
或
D:\mongo\bin>mongoexport -d test -c things --csv -f uid,name,age -o d:\mongo_data\things_2.dat
* mongoimport --type
没有简写的。
指定导入数据文件的格式,默认有csv,json,tsv。
eg:
>D:\mongo\bin>mongoimport -d test -c test1 -type csv -headerline -file d:\mongo_data\things_2.dat
或>D:\mongo\bin>mongoimport -d test -c test1 --type csv -headerline -file d:\mongo_data\things_2.dat
注意:假如我将普通的json数据文件按csv格式来导入,会出现导入失败的情况的
如下所示:
>D:\mongo\bin>mongoimport -d test -c test1 -type csv --headerline -file d:\mongo_data\things.dat
最终插入的数据仅仅为一个记录,而且显示如下:
{
"field1": "$oid",
"field2": "529eabc352bf5eb74acdb35d",
"field3": "name",
"field4": "person1",
"field5": "addr",
"field6": "city",
"field7": "a",
"field8": "state",
"field9": "e"
}
所以,导入的数据文件的格式心中要有数,如果是json的就不要以csv格式的方式导入。
* mongoimport --headerline
没有简写的。
是否忽略第一行数据(只应用于csv和tsv)。在csv和tsv格式的数据文件的首行都是列名,你可以通过添加--headerline来忽略它,否则那一行列名也将作为文档添加到集合中的。
eg:
>D:\mongo\bin>mongoimport -d test -c test1 -type csv -headerline -file d:\mongo_data\things_2.dat
注意,当没有--headline时候,如
>D:\mongo\bin>mongoimport -d test -c test1 -type csv -file d:\mongo_data\things_2.dat
则会提示如下,assertion:9998 you need to specify fields.
意思是你必须指定输出列的名称才行,这一点在下一个例子阐述。
例子5:
需求: 我要导入csv格式数据文件,并导入到test数据库的test1集合中,而且每个文档的列名由(uid,name,age)改为(my_uid,my_name ,my_age)。
eg:
移除test1集合数据(也可以通过RockMongo等GUI 数据库管理器进行操作)
>use test
>db.test1.drop()
>exit
>D:\mongo\bin>mongoimport -d test -c test1 -type csv -f my_uid, my_name, my_age -file d:\mongo_data\things_2.dat
或
>D:\mongo\bin>mongoimport -d test -c test1 -type csv -fields my_uid, my_name, my_age -file d:\mongo_data\things_2.dat
检查:再从test数据库的test1集合导出数据文件来睇睇,刚才导入的数据是否符合我们的要求。
>D:\mongo\bin>mongoexport -d test -c test1 -o d:\mongo_data\test1.dat
导出的数据文件
{ "_id" : { "$oid" : "52a6c33e1eddaea196b9d068" }, "my_uid" : "uid", "my_name" : "name", "my_age" : "age" }
{ "_id" : { "$oid" : "52a6c33e1eddaea196b9d069" }, "my_uid" : "", "my_name" : "", "my_age" : "" }
{ "_id" : { "$oid" : "52a6c33e1eddaea196b9d06a" }, "my_uid" : "", "my_name" : "", "my_age" : "" }
{ "_id" : { "$oid" : "52a6c33e1eddaea196b9d06b" }, "my_uid" : "", "my_name" : "", "my_age" : "" }
{ "_id" : { "$oid" : "52a6c33e1eddaea196b9d06c" }, "my_uid" : "", "my_name" : "", "my_age" : "" }
............
解析:
* mongoimport --fields
没有简写的。
主要对列名进行重新命名。
eg:
>D:\mongo\bin>mongoimport -d test -c test1 -type csv -fields my_uid, my_name, my_age -file d:\mongo_data\things_2.dat
或
>D:\mongo\bin>mongoimport -d test -c test1 -type csv -f my_uid, my_name, my_age -file d:\mongo_data\things_2.dat
注意:
1.当 --headerline 与 -f 同时出现的时候,-f是没意义的。
eg:
>D:\mongo\bin>mongoimport -d test -c test1 -type csv --headerline -f my_uid, my_name, my_age -file d:\mongo_data\things_2.dat
结果的列以things_2.dat文件指定,如uid,name,age
2. -f至少都要给它一个列名
否则,显示如下错误:
required parameter is missing in 'fields'
3.假如我指定的列名数少于总的列数时,未指定的列名将会以“field”+数字 ,组合而成的名作为新列名。
例如,things_2.dat文件除了_id系统列之外,共有uid,name,age3列,这3列我们可以重新指定列名,但我只指定两个新列名,会出现什么现象:
eg:
>D:\mongo\bin>mongoimport -d test -c test1 -type csv --headerline -f my_uid, my_name -file d:\mongo_data\things_2.dat
第三列的列名变成了field2
{
"a": "",
"b": "person1",
"field2": ""
}
本文来源 我爱IT技术网 http://www.52ij.com/jishu/4747.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
