作为一个专业文档型数据库,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