MongoDB操作

Posted 临风而眠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB操作相关的知识,希望对你有一定的参考价值。

MongoDB操作(6):导入和导出

注意!不是在mongo命令行下操作!是另开终端操作!

踩坑记录:

第一次导出mongodb数据库,在网上搜了一波教程,赶紧开始实操,结果我还拿了这些错误类型去搜…

unexpected token: numeric literal :

unexpected token: numeric literal :

截图只是一部分,然后我突然想到mongodump这个指令也要另开终端来执行,然后立马试了下mongoexport本身是不是会报错,果真显示mongoexport is not defined

发现问题后,赶紧导出

成功了:

​ 说明:上面这个截图上面在终端里写了IP地址和端口号,但在本机上操作可以不写,下面的演示都不写

一.导入

详细介绍:mongodb中文手册

1.导入csv

​ 针对没有设置密码的mongodb ,有密码的还要加上 -u 用户名 还要 -p 密码

常用格式命令:

mongoimport -d dbname -c collectionname --file filename --type=csv -f field
-d 		数据库的名字
-c 		集合名字
--file  要导入的文件(要写路径)
--type  导入的文件类型 ,默认是json


-f 		要导入的字段(指明要导入那些列)
--headerline:表示文件中的第一行作为数据头
#查到很多博客的另一种说法:指明不导入第一行,因为第一行是每一列的名称(作为key)

​ 注:若mongoimport插入数据到之前没有创建的数据库和集合,则会自动创建

type后面的=可以不写

​ --headerline 和-f不能同时出现! 但-f、–headerline、–fieldFile必须有一个(看后面的解释)

无限踩坑记录…救命…

–headerline和-f

给我整无语的踩坑探索:
一开始理解错了headerline

不少博客上说–headerline的意思是:”headerline表示第一行为属性名不用导入“,然后又看到*“–headerline是第一列不用导入”*

我:???

我要导入豆瓣电影数据

我以为headerline是那个最左边那个序号1、2、3、4、5…

后来细品网友的解释,终于知其意…

headerline就是前面那个第一行:名字、投票人数、类型

前面说了--headerline-f还有--fieldFile必须有一个,先来单独看--headerline:

果真:第一行作为列的名称, 作为了key ,表格的其他行都是value

​ 插播:

​ 原本这份文档是xlsx格式,被我硬另存为csv了:

网上说是要用这种标注了UTF-8的csv防止乱码

​ 这样子看着上映时间乱码,其实用vscode这样的文本编辑器打开,是没有乱码的

​ 网上看到说修改csv就要在文本编辑器里修改,不要在excel里面修改

官方文档也各种没看懂

​ 因为查了不少博客,有的说-f 有的说 --fileds,那是给我看的军头转向…

​ 仔细一品 这个中括号 意思是不是 括号里面和外面的那个写法等价?

试一试 --db和-d是不是一样的

怀着心态崩溃的心情,先试一试–db和那个-d是不是一样的,如果,果真效果是一样的

​ 注:–headerline写在了后面,写的位置不要紧

先来看看-f指定一个字段效果会咋样

第一个键是我指定的”电影名字“,后面分别是自动给的field1,field2,直到field8

​ 牛津词典上field有字段的中文意思

把-f换成–fields试一下

​ 注意,出现下面这个错误,是因为–fields写成了-fields

结果:

此时确实指定的字段都成为了键

但是第一行出问题了… 而前面-f只指定了一个的时候却不会把csv的第一行变成值,

难道 -f 和 --fields还是有区别??

看不懂文档,就实操,可是更奇怪的事情发生了

用find()查询,第二条数据却是表格的第一行…麻了…什么鬼问题啊…

难道字段加引号有问题?

看了下别人的博客…每加引号

还是有那个问题…

难道是中文字段的问题?

​ 一般中文都比较容易出问题

那我就换成英文

在前两条数据确实没发现

但因为上面发现导入数据库的时候会有顺序问题,所以用find找一下

果真找到了…而且其实就在第三条数据…

开始怀疑headerline

之前看headerline不会是我没看清楚吧,不会也有"名字":"名字“吧?

赶紧试一下

结果是 没有!!

而且其他方式都是插入38723条数据

–headerline是插入38722条数据…

那放心了

fieldFile

菜狗尝试努力理解官方文档

file with fields name - one per line,那就是写了字段名字的文件, 每行写一个字段

我在桌面新建一个txt文件

理解的没错,但菜狗搞了三次,第一次–写成了-

第二次test.txt写成了a.txt

总结

​ 网上只有大量重复的解释那几个常用字段的博客,我花了这么多时间探索这个有点浪费时间,先放着

此处待解决! ! !

​ 但其实要解决的话只要把那条多余的数据删掉就行了… 只是这里想探究一下问题…😭

​ 或者在文本编辑器里面,把字段修改好了,再加上–headerline导入 !

至于upsert等参数,还没有研究过,可以看看这个总结的很好的

2.导入json

常用格式命令:

mongoimport -d dbname -c collectionname --file filename --type=json
-d 		数据库的名字
-c 		集合名字
--file  要导入的文件(要写路径)
--type  导入的文件类型 ,默认是json(等号可以不写!)

注意:

导入json不能使用-f 或者–fields或者–fieldFile

未解决疑问

​ 导入json不能使用-f 或者–fields或者–fieldFile,那有什么相同功能针对json的吗?..

二.导出

​ 看官方文档的时候还要注意版本

看到这里的时候我去看了一下自己的版本

还是注意,不要在mongo命令行里面用

1.导出csv

把先前导入的csv文件再导出去…

常用格式命令:

mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 条件导出 --csv -o 文件名  
必须要有-f 提供字段

不然会报错:

第一个给出字段”m“而实际上没有,那就导出空的csv,第二个我给的名字字段是有的,于是成功导出了

试水-q字段…心态又炸了

这不把人心态搞崩… 主要就是格式问题

其中查了几个

mongo报错 is not valid JSON: json

windows上操作-q后面要加双引号

error parsing command line options: too many positional arguments:

​ StackOverflow上面这个说csv那个可能有空格 比如 名字 ,评分 ,

可我打开vscode看了一下,没有

最终问题还是固定在了 Failed: error parsing query as Extended JSON: invalid JSON input

找到StackOverflow的回答

极其怀疑是中文的问题吧!

重新创建一个movie_data3,把几个字段改成英文…

成功导入数据库

心态逐渐崩溃

-q 后面的东西改了无数次…rnmd,想砸电脑了

关键是rnmd 官方文档也坑我啊!

我输入了

mongoexport --help

其实关于-q的解释是这样的:

querying options:
  /q, /query:<json>                               query filter, as a JSON
                                                  string, e.g., '{x:{$gt:1}}'
                                                  query filter (JSON)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n8DJFtkP-1629178379562)(https://cdn.jsdelivr.net/gh/xin007-kong/picture_new/img/20210817131018.png)]

你这个eg给的… 不是标准json啊…

黎明的那道光

查到一个也踩了很多坑的兄弟:踩坑——Mongodb mongoexport -q 的使用

可惜他的最终解决方案是-q后面的json要用单引号括起来,我这windows只能用双引号

然而windows用双引号wnmd试了无数次了,如果写成标准的json,他双引号到底是把哪一个括起来都会识别错误

再度绝望

官方文档犯的就是这个错误

用一个StackOverflow上的回答来说,那个是js不是json

复行数十步,豁然开朗!!!!!!!!!!!!!

查到了这篇博客MongoDB导出工具mongoexport在复杂查询条件下的使用

这位博主说的json可能在终端里面格式不对…太一针见血了…

可惜标准json的格式我不是很确定,所以这样尝试也失败了多次

然后我想想能不能直接用json,别用txt了,就用可以报错纠正json格式的vscode搞好了!!!

成功了!差点跳起来!

然后把这个json后缀改成txt形式,也可以成功,主要就是json格式要标准

燃起来了!

​ 菜!但嚣张!

2.导出json

​ 开头引入就是导出了json

再多试一个参数–pretty,可以将json串格式化为带格式的json串

三.总结

  • 其实一开始要导出数据的时候,我的第一想法是之前学过的mongodump备份,但想想应该会有专门的操作,于是就去查了一下,没想到把自己心态搞崩了

然后去稍微查了一下他们的区别,没有深入了解

  • 呜呜呜

    本来按理说很容易的操作,给我折腾了这么久…

    当没有很好的教程时,官方文档应该就是最好的解释,但是阅读官方文档能力属实有点弱…

  • 这篇博客好乱…

  • 数据库少用中文!少用中文!少用中文!避免麻烦

  • 看这篇博客的读者肯定会感觉这篇没啥用呜呜呜…我只是把我的问题说出来了,没有把能直接用的东西干练的总结出来

(下次一定)(bushi

  • 搜到一个博客说…用可视化工具导入导出只要点几下就🆗,​我要🔥速去下载可视化工具

以上是关于MongoDB操作的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB PHP

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项

mongodb关联查询

VSCode 如何操作用户自定义代码片段(快捷键)