如何将mongo查询结果导出到文件中以及导入到另一个Mongo库中_girdfs怎么导出到另外一个mongodb库

CSDN博客 · · 822 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

作为一个专业文档型数据库,MongoDB有一个很大的优势,就是使用JavaScript使用、管理数据库,所以也能够使用JavaScript脚本进行复杂的管理,就像Oracle中使用自定义函数、存储过程一样使用、管理数据库。

mongodb 的shell是javascript实现的,如果直接使用javascript实现相应的功能则显得很直观和简便。运行JavaScript脚本有四种[1]方式:

(1) 交互式 mongo shell

大部分的 mongodb 教程,在第一章都会讲解这种方式。

mongo 127.0.0.1:27017
use test
db.users.findOne()

(2) mongo --eval 运行一段脚本

不进入交互模式,直接在 OS 的命令行下运行一段mongodb脚本。

mongo 127.0.0.1:27017/test --eval "printjson(db.users.findOne())"

(3) 在OS命令行下,运行一个js文件

mongo 127.0.0.1:27017/test userfindone.js

userfindone.js 的内容:
printjson(db.users.findOne());

(4) 在mongo shell 交互模式下,运行一个js文件

mongo test
load("/root/mongojs/userfindone.js")

其中,load() 参数中的文件路径,既可以是相对路径,也可以是绝对路径。

本文采用第3种方案,直接中windows OS环境下,在cmd中运行命令。

1. 如何将mongo查询结果导出到文件中

(1)新建一个js文件,将查询方法写进去,如query1201.js,文件内容如下

var c = db.getCollection('DJXX_WLW_SJKZ').find({jh:{"$in":["X1-001","X1-002","X1-005","X2-002","X3-005"]},cjsj:{"$ne":"N/A"},dataCode:200},{jh:1,sgtsj:1,dltsj:1,cjsj:1}).sort({cjsj:-1})
while(c.hasNext()) {
    printjson(c.next());
}

(2)输入OS Shell命令来执行

mongo mongodb://192.168.*.**:27017/xxxx --username XXXX --password **** query1201.js >result1201.json

这样查询的结果就会直接生成在当前文件夹下的result1201.js文件中

2. 将JSON格式文本文件输入导入到数据库中

启动windows环境下的MongoDB数据库[2]

D:\mongodb\bin>mongod -config d:\mongodb\conf\mongod.cfg
2019-03-08T21:04:07.460+0800 I CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2019-03-08T21:04:07.464+0800 I CONTROL  [main] log file "D:\mongodb\log\mongodb.log" exists; moved to "D:\mongodb\log\mongodb.log.2019-03-08T13-04-07".

使用Mongo客户端,新创建Collection为

D:\mongodb\bin>mongo
MongoDB shell version v4.0.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.0
Welcome to the MongoDB shell.
......
MongoDB Enterprise > show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
mytest  0.180GB
MongoDB Enterprise > use mytest
switched to db mytest
MongoDB Enterprise > db.createCollection("DJXX_WLW_SJKZ")

使用mongoimport命令从文件中,导入数据。

D:\mongodb\bin>mongoimport/bypassDocumentValidation --db mytest --collection DJXX_WLW_SJKZ --file G:\result1201a.json
2019-03-09T19:36:22.365+0800    connected to: localhost
2019-03-09T19:36:24.349+0800    [........................] mytest.DJXX_WLW_SJKZ    23.3MB/3.67GB (0.6%)
2019-03-09T19:36:30.345+0800    [........................] mytest.DJXX_WLW_SJKZ    114MB/3.67GB (3.0%)  3.66GB/3.67GB (99.7%)
2019-03-09T19:37:18.345+0800    [#####...................] mytest.DJXX_WLW_SJKZ    824MB/3.67GB (21.9%)
......
2019-03-09T19:40:31.082+0800    [########################] mytest.DJXX_WLW_SJKZ    3.67GB/3.67GB (100.0%)
2019-03-09T19:40:31.082+0800    imported 785788 documents

3. 导入数据过程中,所遇到的问题

导入数据过程中,所遇到的问题是导出JSON文件格式问题,提示错误如下:

D:\mongodb\bin>mongoimport/bypassDocumentValidation --db mytest --collection DJXX_WLW_SJKZ --file G:\result1201.json
2019-03-09T22:35:33.685+0800    connected to: localhost
2019-03-09T22:35:33.739+0800    Failed: error processing document #1: invalid character 'o' in literal MaxKey or MinKey (expecting 'a' or 'i')
2019-03-09T22:35:33.740+0800    imported 0 documents

打开JSON数据文件,发现多出4行开头文本描述,内容如下(属于命令行重定向输出问题,有办法解决吗?欢迎指导):

<class 'str'> MongoDB shell version v4.0.0
<class 'str'> connecting to: mongodb://192.168.*.***:27017/xxxx
<class 'str'> MongoDB server version: 3.4.14
<class 'str'> WARNING: shell and server versions do not match

由于JSON数据文件达到3.6G,一般编辑器打不开,为此使用Python编段小程序查看,并删除此四行文本内容。

补充:

关于权限问题。
mongoimport --username dba --password 123456 --db dev --collection DJXX_WLW_SJKZ --file /home/python/下载/result201903a.json --authenticationDatabase admin

这里重点是**–authenticationDatabase admin**参数,因为用户是在admin数据库中,权限验证需要到admin中。

对于Python中的用法如下:
client = pymongo.MongoClient(‘mongodb://dba:123456@192.168.1.200:27017/admin?authMechanism=SCRAM-SHA-1’)
db = client[“dev”]
collection = db[“DJXX_WLW_SJKZ”]

(1)导出需要的数据,例如_id就不需要到出,再用空间:

var c = db.getCollection('DJXX_YCDT').find({},{"jh":1,"cjsj":1,"cjsj_ny":1,"bj":1,"yy":1,"ty":1,"cyl":1,"hs":1,"cc":1,"cc2":1,"cc_ll":1,"cc2_ll":1,"sxdl":1,"xxdl":1,"sgtds":1,"sgtsj":1,"zdzh":1,"zxzh":1,"yzz":1,"gzz":1,"djgkyy_sys":1,"djgkyybh_sys":1,"zt":1,"dym":1,"cmd":1,"ly":1,"errorCount":1,"_id":0})
while(c.hasNext()) {
	str = c.next()
	
	str.llcc = str.cc_ll
	delete str.cc_ll
	str.llcc2 = str.cc2_ll
	delete str.cc2_ll

    printjson(str);

}

(2)对于超大文件编辑(大于2G),前面说到多出四行内容,解决方案是再Linux下,使用vim编辑器编辑,删除此四行保存即可。

参考:
[1]《mongodb shell 运行js脚本的四种方式》 CSDN博客 wershest 2017.06
[2]《Python开发中使用Mongo DB入门实践》 CSDN博客 肖永威 2018.07
[3]《Failed: error connecting to db server: server returned error on SASL authentication step: Authentica》CSDN博客 雅冰石 2015.06

822 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传