您的位置:首页 > 数据库 > Mongodb

NoSQL 学习-- MongoDB部署、数据库管理、数据类型、备份、导入导出

2019-07-25 09:52 609 查看

NoSQL 学习三--- MongoDB部署、数据库管理、数据类型、备份、导入导出

转载:https://blog.csdn.net/weixin_41072205/article/details/90217432

一、MongoDB概述
中国社区:http://www.mongoing.com/
软件:linux/mongodb-linux-x86_64-rhel70-3.6.12.tgz
下载地址:https://www.mongodb.org/dl/linux/x86_64
介绍:——介于关系型数据库和非关系型数据库之间的产品;由C++语言编写
— 一款基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据库解决方案
— 将数据存储为一个文档(类似于JSON对象),数据结构由键值(key=>value)对组成
— 支持丰富的查询表达,可以设置任何属性的索引
— 支持副本集,分片
软件特点:
— 安装简单
— 面向文档存储,操作比较简单容易
— 支持丰富的查询表达
— 可以设置任何属性的索引
— 支持主流编程语言 RUBY |PHTHON | JAVA |PHP |C++
— 支持副本集,分片

mongodb 三大技术特色:灵活动态文档模型;高可用replica set 、水平扩展sharding
同时具备 丰富的功能: JSON 文档模型、动态的数据模式、二级索引强大、查询功能、自动分片、水平扩展、自动复制、高可用、文本搜索、企业级安全、聚合框架MapReduce、大文件存储GridFS。
缺点:多表关联:仅支持left outer join
SQL语句支持:查询为主,部分支持
多表原子事务:不支持
多文档原子事务:不支持
16MB文档大小限制,不支持中文排序,服务端javasrcipt性能欠佳。
重点: mongodb有2种典型的架构模式:replica set和sharding

Mongodb数据库与SQL的结构对比详解
SQL ——————————————————Mongodb
database —— database
table —— collection
row —— document or BSON document
column —— field
index —— index
table joins —— embedded document and linking
primary key —— primary key
specify any unique column or —— in mongodb ,the primary key is
column combination as primary key —— automactially set to the_id field
aggregation —— aggregation pipeline

Mongodb数据存储格式
使用JSON (JavaScript object notation)文档存储记录。
MongoDB中document以BSON形式存放。
JSON数据格式脱胎于javascript,JOSN的官方MIME类型是application/json ,文件扩展名是.json
MongoDB适用场景
——网站数据、缓存等大尺寸、低价值的数据
——在高伸缩性的场景,用于对象及JSON数据的存储。

三、部署 Mongodb 服务(61/62/63主机部署mongodb)
软件:linux/mongodb-linux-x86_64-rhel70-3.6.12.tgz
#tar -xvf mongodb-linux-x86_64-rhel70-3.6.12.gz
#cd mongodb-linux-x86_64-rhel70-3.6.12/
#mkdir /usr/local/mongodb
#cp -r mongodb-linux-x86_64-rhel70-3.6.12/bin/ /usr/local/mongodb/
#cd /usr/local/mongodb/
#mkdir -p etc log data/db 创建配置文件目录、数据库目录、日志目录
]# vim /etc/profile
export PATH=/usr/local/mongodb/bin:$PATH (添加改行,定义全局变量)
]# source /etc/profile

]# vim /usr/local/mongodb/etc/mongodb.conf 手动添加配置文件
logpath=/usr/local/mongodb/log/mongodb.log //日志文件存放目录
logappend=true //追加的方式记录日志信息
dbpath=/usr/local/mongodb/data/db // 数据文件存放目录
fork=true //以守护进程的方式启用,及后台运行;默认false。
(port =27017 //端口
httppinterface = true //关闭web管理访问,默认关闭27017端口访问;
auth = true //是否开启权限验证
bind_ip = 0.0.0.0 //绑定ip ,让其能够通过外网访问,0.0.0.0 代表所有)

】#mongod -f /usr/local/mongodb/etc/mongodb.conf

注意:这里可能会出现好几种报错:
number 100 ——一般是因为锁了
number 1 ——一般是文件没配置好,查看是mongodb下是否有log目录
number 48 —— 一般跟日志文件有关

—— 1、ERROR: child process failed, exited with error number 100
To see additional information in this output, start without the “–fork” option.
ongod --config /usr/local/mongodb/etc/mongod.conf

出错原因:mongodb 服务在不正常关闭的情况下,mongod 被锁.
解决办法:
1、删除 mongod.lock 文件和日志文件 mongodb.log
2、cd /usr/local/mongodb/bin
#find / -name mongod.lock
]# find / -name mongodb.log
/var/lib/mongo/mongod.lock
/usr/local/mongodb/log/mongodb.log
]# rm /var/lib/mongo/mongod.lock
#rm /usr/local/mongodb/data/db/mongod.lock
]# rm /usr/local/mongodb/log/mongodb.log
]# mongod -f /usr/local/mongodb/etc/mongodb.conf --repair 以修复方式启动mongodb
]# mongod -f /usr/local/mongodb/etc/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 4395
child process started successfully, parent exiting (成功!)
]# ps -C mongod 查看进程
4395 ? 00:00:01 mongod
]# netstat -antulp | grep :27017 查看端口号
]# mongo 连接mongodb 服务

——2、ERROR: child process failed, exited with error number 1
—3、ERROR: child process failed, exited with error number 48ex
]#mongod --dbpath=/usr/local/mongodb/data/db --logpath=/usr/local/mongodb/log/mongodb.log --repair
以修复模式运行,可以查出具体原因
或者 cat /usr/local/mongodb/log/mongodb.log 查看原因
】#mongod --dbpath=/usr/local/mongodb/data/db --logpath=/usr/local/mongodb/log/mongodb.log --fork
child process started successfully, parent exiting

注意:warning:千万不能使用kill -9 ,因为MongoDB使用mmap方式进行数据文件管理,也就是说写操作基本是在内存中进行,写操作会被每隔60秒(syncdelay设定)的flush到磁盘里。如果在这60秒内flush处于停止事情我们进行kill -9那么从上次flush之后的写入数据将会全部丢失。
如果在flush操作进行时执行kill -9则会造成文件混乱,可能导致数据全丢了,启动时加了repair也无法恢复。

——4、 Error parsing YAML config file: yaml-cpp: error at line 3, column 68: illegal map value
原因:配置文件/etc/mongod.conf格式的错误。
(mongodb 3.0之后配置文件采用YAML格式,这种格式非常简单,使用:表示,开头使用“空格”作为缩进。需要注意的是,“:”之后有value的话,需要紧跟一个空格,如果key只是表示层级,则无需在“:”后增加空格(比如:systemLog:后面既不需要空格)。按照层级,每行4个空格缩进,第二级则8个空格,依次轮推,顶层则不需要空格缩进。如果格式不正确,将会出现上面的错误)
解决办法:我也不太清楚具体出错的原因,只能 把/usr/local/mongodb/etc/mongod.conf配置文件内容重写一遍,
然后就没出错了,有点瞎猫的意思,等下次出现我再找找原因。
++++注意:/etc/mongod.conf 是配置运行参数文件
/usr/local/mongodb/etc/mongdb.conf 是 mongdb 启动的配置文件

三、MongoDB配置文件/etc/mongod.conf说明
#cd /usr/local/mongodb/bin
bsondump
mongo 客户端程序,连接MongiDB
mongodump 备份数据
mongofiles GridFS工具,内建的分布式文件系统
mongoperf
mongorestore
mongostat 监视程序
install_compass
mongod 服务端程序,启动MongoDB
mongoexport 导出数据
mongoimport 导入数据
mongoreplay
mongos 数据分片程序,支持数据的横向扩展
mongotop

在Mongod安装包中,包含2个进程启动文件:mongod和mongos;
  • 1
[/code]

3.1 mongod
mongd是核心基础进程,用来接收读写请求、负责存储实际数据,mongod实例是构成集群的基本单位,比如Replication set、Sharding Cluster、Config Servers等。
重要配置参数介绍:
—— 3.1.1 processManagement:
fork: <true | false> 是否以fork模式运行mongod/mongos进程,默认为false;
pidFilePath:<路径>
配合"fork:true"参数,将mongod/mongos进程ID写入指定的文件,如果不指定,将不会创建PID文件。

—— 3.1.2 net:
bindIp: <127.0.0.1> mongod/monogs进程绑定的IP,application通过此IP、port建立链接;
port: 27017 侦听端口,默认为27017;
如果在一个节点上部署多个mongod实例,需要注意修改此端口以避免冲突;
maxIncomingConnections: 65536
mongod/mongos进程允许的最大连接数,如果此值超过操作系统配置的连接数阀值,将不会生效(ulimit);默认值为65536。通常客户端将会使用连接池机制,可以有效的控制每个客户端的链接个数;
wireObjectCheck: true
当客户端写入数据时,mongos/mongod是否检测数据的有效性(BSON),如果数据格式不良,此insert、update操作将会被拒绝;默认值为true
ipv6: false 是否支持mongos/mongod多个实例之间使用IPV6网络,默认值为false。

——3.1.3 storage:
dbPath: db mongod进程存储数据目录,此配置仅对mongod进程有效。默认值为:/data/db;
indexBuildRetry: true
当构建索引时mongod意外关闭,那么再次启动是否重新构建索引;索引构建失败,mongod重启后将会删除尚未完成的索引,但是否重建由此参数决定。默认值为true;
repairPath: _tmp
配合–repair启动命令参数,在repair期间使用此目录存储临时数据,repair结束后此目录下数据将被删除,此配置仅对mongod进程有效。不建议在配置文件中配置,而是使用mongod启动命令指定;
engine: mmapv1
存储引擎类型,mongodb 3.0之后支持“mmapv1”、“wiredTiger”两种引擎,默认值为“mmapv1”;

—— 3.1.4 journal:
enabled: true
否开启journal日志持久存储,journal日志用来数据恢复,是mongod最基础的特性,通常用于故障恢复。64位系统默认为true,32位默认为false,建议开启,仅对mongod进程有效。
directoryPerDB: false
是否将不同DB的数据存储在不同的目录中,dbPath的子目录,目录名为db的名称;
此参数仅对mongod进程有效,默认值为false,不建议修改此值。
对已经存储数据的mongod修改此值,需要首先使用mongodump指令将数据导出,然后关闭mongod,再修改此值和指定新的dbPath,然后使用mongorestore指令重新导入数据。(即导出数据,并使用mongorestore将数据重新写入mongod的新目录中);对于replica set架构模式,只需要在每个secondary依次操作:关闭secondary,然后配置新的dbPath,然后启动即可(会执行初始化sync,从primary中将数据去完全同步到本地),最后操作primary。
syncPeriodSecs: 60
mongod使用fsync操作将数据flush到磁盘的时间间隔,默认值为60(单位:秒)。强烈建议不要修改此值;mongod将变更的数据写入journal后再写入内存,并间歇性的将内存数据flush到磁盘中,即延迟写入磁盘,有效提升磁盘效率。此指令不影响journal存储,仅对mongod有效。

—— operationProfiling
slowOpThresholdMs: 100
数据库profiler判定一个操作是“慢查询”的时间阀值,单位毫秒,默认值为100,此值只对mongod进程有效;
mode: off 数据库profiler级别,操作的性能信息将会被写入日志文件中
1)off:关闭profiling
2)slowOp:on,只包含慢操作日志
3)all:on,记录所有操作
数据库profiling会影响性能,建议只在性能调试阶段开启。
—— replication:(复制集架构模式配置)
oplogSizeMB: 10240
replication操作日志的最大尺寸,单位:MB。
此值不要设置的太小, 应该足以保存24小时的操作日志,以保证secondary有充足的维护时间;
enableMajorityReadConcern: false
是否开启readConcern的级别为“majority”,默认为false;只有开启此选项,才能在read操作中使用“majority”。(3.2+版本)
replSetName: <无默认值>
“复制集”的名称,复制集中的所有mongd实例都必须有相同的名字,sharding分布式下,不同的sharding应该使用不同的replSetName。

3.3 mongos
mongos是Sharding Cluster架构模式中的“路由”进程,即客户端请求访问mongos,然后有mongos将请求转发给合适的sharding server执行操作,并将result返回给客户端,所以mongos基本不存储数据,只是在内存中缓存部分shard
key与sharding server的对应关系,便于路由。

四、mongodb管理
4.1 常用管理命令
——show dbs //查看已有的库
——db //显示当前的所在的库
——use 库名 //切换库,若库不存在延时创建库
——show collections 或 show tables //查看库下已有的集合
——db.dropDatabase() //删除当前所在的库

4.2 数据库名称规范
—— 不能是空字符串("")
—— 不得含有 ’ ’ (空格)、 . 、$ 、 / 、\ 和\0(空字符)
—— 应全部小写
—— 最多64字节

4.3 集合管理
—— show collections 或 show tables //查看集合
—— db.集合名.drop() //删除集合
—— db.集合名.save({","}) //创建集合,集合不存在时,创建并添加文档

4.4 集合名命名规范
—— 不能是空字符串 " "
—— 不能含有\0字符(空字符),此字符表示集合的结尾
—— 不能以"system." 开头,这是为系统集合保留的前缀
—— 用户创建的集合名字不能含有保留字符

4.5 文档基本管理
文档:类似于MySQL表里的记录
查看、统计、添加、删除文档
— db.集合名.find() 查看集合所有内容
— db.集合名.count()
— db.集合名.insert({“name”:“jim”}) 添加文档
— db.集合名.find({条件}) 查找
— db.集合名.findOne() //返回第一条文档 (O为大写)
— db.集合名.remove({}) //删除所有文档
— db.集合名.remove({条件}) //删除匹配的所有文档

五、数据类型
5.1 字符串string
——UTF-8 字符串都可以表示为字符串类型的数据
——{name:“张三”} 或{ school:“tarena”}

5.2 布尔bool
—— 布尔类型有两个值 true 和false ,{x:true}

5.3 空null
—— 用于表示空值或者不存在的字段,{x:null}

5.4 数组/数组array
数值—— shell 默认使用64位浮点型数值。{x:3.14} 或{x:3};
numberint (4字节整数) {x:numberint(3)}
numberlong (8字节整数) {x:numberlong(3)}
数值array
数据列表或数据集可以表示为数组
{x:[“a”,“b”,“c”]}

5.5 代码/日期/对象
代码——查询和文档中可以包括任何javascript代码;
{x:function() {/* 代码 */}}
日期——日期被存储为自然纪元以来经过的毫秒数,不含时区
{x:new date()}
对象——对象id是一个12字节的字符串,是文档的唯一标识
{x:objectId()}

5.6 内嵌/正则表达式
内嵌
——文档可以嵌套其他文档,被嵌套的文档作为值来处理
{tarena:
{address:“Beijing”,tel:“888888”,person:“hansy”}}
正则表达式
——查询时,使用正则表达式作为限定条件
{x:/正则表达式/}

六、数据导入导出
6.1 数据导出
格式1:#mongoexport [–host IP地址 --port 端口 ] -d 库名 -c 集合名
-f 字段名1,字段名2 --type=csv -o 目录名/文件名.csv

格式2:# mongoexport --host IP地址 --port 端口 -库名 -c 集合名 -q ‘{条件}’
-f 字段名1,字段名2 – type=csv >目录名/文件名.csv
(注意:导出为csv格式必须使用-f 指定字段名列表)
格式3:#mongoexport [–host IP地址 --port 端口 ] -d 库名 -c 集合名
[ -q ‘{条件}’ -f 字段列表 ] \ – type=json >目录名/文件名.json

6.2 数据导入
语法格式1:#mongoimport -host IP地址 -port 端口 -d 库名 -c 集合名
–type=json 目录名/文件名.json
语法格式2:
#mongoimport -host IP地址 -port 端口 -d 库名 -c 集合名
–type=csv [–headerline] [–dorp] 目录名/文件名.csv

注意:1、导入数据时,若库和集合不存在,则先创建库和集合后再导入数据;
2、若库和集合已存在,则以追加的方式导入数据到集合里
3、使用 --drop选项可以删除原数据后导入新数据,–headerline 忽略标题

七、数据备份恢复
7.1 数据备份
备份数据所有库到当前目录下的dump目录下
#mongodump [–host ip 地址 --port 端口]
备份时指定备份的库和备份目录
#mongodump [–host ip 地址 --port 端口] -d 数据库名 -c 集合名 -o 目录
查看bson文件内容
#bsondump ./dump/bbs/t1.bson

7.2 数据恢复
格式:#mongorestore --host IP地址 --port 端口 -d 数据库名 [ -c 集合名] 备份目录名

八、练习:
启动服务:#mongod --dbpath=/data/db --port=27017 --fork --lohpath=/usr/local/mongodb/log/mongod.log
child process started successfully, parent exiting
停止服务]# mongod --dbpath=/data/db --shutdown
killing process with pid: 4395
给启动服务和停止服务起个别名:
启动别名:]# alias qmdb=‘mongod -f /usr/local/mongodb/etc/mongodb.conf’
停用别名:]# alias smdb=‘mongod -f /usr/local/mongodb/etc/mongodb.conf --shutdown’
]# qmdb
]# smdb
将别名存放到bash的初始化文件/etc/bashrc中:
]# vim /etc/bashrc (在最后插入)
alias qmdb=‘mongod -f /usr/local/mongodb/etc/mongodb.conf’
alias smdb=‘mongod -f /usr/local/mongodb/etc/mongodb.conf --shutdown’

连接mongodb服务
]# mongo
] > show dbs 显示已有库
】> db 查看当前所在的库
】> use local 切换库
】> use xixi //切换库,若库不存在的话 会自动延时创建库
】> db
】> db.dropxixi //删除库
] > show dbs
】 > exit 退出
集合管理:
创建集合:db.集合名.save({’’,’’}) 创建集合,集合不存在时,创建并添加文档
】 > db.t1.save({name:“yaya”,age:60,addr:“hebei”,email:“yaya@136.com”})
】> db.t1.save({name:“yaya”,age:70})
】> show tables
】> db.t1.find() 查看集合里所有内容
】> db.t1.findOne() 查看集合的第一行(O 是大写的)
】> db.t1.save({name:“xm”,age:18,addr:“hn”,email:“xm@qq.com” ,like:“nicai”})
】> db.t1.count() 统计文档个数
】> db.t1.find({name:“xm”}) 根据条件查找文档
】> db.t1.remove({name:“yaya”}) 删除与条件匹配的所有文档
】> db.t1.remove({}) 删除所有文档

插入文档:
】> db.col.insert(
… { title: ‘MongoDB 教程’,
… description: ‘MongoDB 是一个 Nosql 数据库’,
… by: ‘MongoDB中文网’,
… url: ‘http://www.mongodb.org.cn’,
… tags: [‘mongodb’, ‘database’, ‘NoSQL’],
… likes: 100
… }
… )
】> show collections
】> db.col.find()
】> db.col.remove({title:‘MongoDB 教程’}) 删除文档
基本数据类型:
null :用于表示空值或者不存在的字段,{“x”:null}
】> db.t1.save({name:“bobo”,work:null})
】> db.t1.find()
】> db.t1.save({_id:9,name:“jerry”,work:null}) _id默认自己创建出来

布尔值:布尔类型有两个值true和false,{“x”:true}
】> db.t1.save({name:“lisi”,addr:“ah”,marry:“true”})
】> db.t1.save({name:“huahua”,addr:“ah”,marry:“false”})
】> db.t1.find()

数值:shell默认使用64为浮点型数值,{“x”:3.14}或{“x”:3},对于整型值,可以使用NumberInt(4字节符号整数)或NumberLong(8字节符号整数),{“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)}
】> db.t1.save({name:“linming”,work:“ls”,pay:2707.60})
】> db.t1.find({pay:2707.60})

字符串:UTF-8字符串都可以表示为字符串类型的数据
】> db.t1.save({name:“hihi”,work:null,pay:null})
】> db.t1.save({name:“花湖”,work:“失业”,pay:“没有”})

日期:日期被存储为自新纪元依赖经过的毫秒数,不存储时区{“x”:new Date()}
】> db.t1.save({name:“bob”,worktime:new Date()})
】> db.t1.find({name:“bob”})

正则表达式:查询时,使用正则表达式作为限定条件,语法与JavaScript的正则表达式相同,{“x”😕[abc]/}
】> db.t1.save({procname:“php”,code:/abc$/})
】> db.t1.save({procname:“php”,code:/[a-z]/})
】> db.t1.save({procname:“java”,code:/[a-z]/})

数组:数据列表或数据集可以表示为数组,{“x”: [“a“,“b”,”c”]},一个字段有多个值
】> db.t1.save({name:“jim”,email:[“lisi@163.com”,“liji@yaho.net”,“haha@qq.com”]})
】> db.t1.find({name:“jim”})

内嵌文档:文档可以嵌套其他文档,被嵌套的文档作为值来处理,{“x”:{“y”:3 }}
】> db.t1.save({book:{homework:“dmy”,class:“num01”,jiaqian:69,version:2.0}})
{ “_id” : ObjectId(“5cdce1ce288b1b99cac17709”), “book” : { “homework” : “dmy”, “class” : “num01”, “jiaqian” : 69, “version” : 2 } }

对象 Id:对象id是一个12字节的字符串,是文档的唯一标识,{“x”: objectId() }
ObjectId对象类型,使用12字节的存储空间,每个字节2位十六位制数字,共计24位字符串
0 1 2 3 (时间戳)、4 5 6(机器)、 7 8 (进程PID)、 9 10 11(计数器)

】> db.t2.save({stunum:ObjectId(),name:“yaya”,class:“qh”})
】> db.t2.find()
{ “_id” : ObjectId(“5cdce2c5288b1b99cac1770b”), “stunum” : ObjectId(“5cdce2c5288b1b99cac1770a”), “name” : “yaya”, “class” : “qh” }
//自己定义一个id字段,一般情况下都用内置的id字段,相当于mysql里的primary key auto_increment

二进制数据:二进制数据是一个任意字节的字符串。它不能直接在shell中使用。如果要将非utf-字符保存到数据库中,二进制数据是唯一的方式。

代码:查询和文档中可以包括任何JavaScript代码,{“x”:function(){/…/}}
】> db.t2.save({lname:“html”,codescript:function(){/…/}})
】> db.t2.save({lname:“html”,codescript:function(){/

abc

/}})

数据导入/导出/备份/恢复

]# mongodump //不指定备份哪个库,默认备份所有,不指定目录,自动生成dump目录,备份的数据在这个里面
]# bsondump dump/t1/t1.bson 查看bson文件内容
]# bsondump dump/t1/t2.bson
]# bsondump dump/col/t1.bson
]# bsondump dump/col/t1.bson

备份时指定备份的库和备份目录
]# mongodump -d t1 -o /root/t1
//-d备哪个库,-o指定备份的目录,备份t1库里的所有到/root/t1
只备份t1库里的集合t2
]# mongodump -d t1 -c t2 -o /root/t1.t2

恢复数据 mongorestore
]# mongo
show dbs
]> db.t1.remove({})
]> exit
]# mongorestore -d t1 /root/t1.t2/t1
//-d t1恢复到数据库的目录,从/root/t1.t2/t1 目录恢复

数据导出,用csv的格式导出
]# mongoexport -d t1 -c t2 -f name --type=csv -o /root/t01.csv
//导出csv格式,必须要指定导出的字段名 ,导出name字段
]# cat t01.csv
name
yaya

用json的格式导出
]# mongoexport -d t1 -c t2 --type=json -o /root/t03.json
]# cat t03.json
{"_id":{“KaTeX parse error: Expected 'EOF', got '}' at position 41: …ed 'EOF', got '}̲' at position 3…oid”:“5cdce2c5288b1b99cac1770a”},“name”:“yaya”,“class”:“qh”}
{"_id":{“KaTeX parse error: Expected 'EOF', got '}' at position 41: …ed 'EOF', got '}̲' at position 3…code”:“function (){/…/}”}}
]# mongoexport -d t1 -c t2 -f name --type=json -o /root/t04.json
]# cat t04.json
{"_id":{"$oid":“5cdce2c5288b1b99cac1770b”},“name”:“yaya”}

导入
]# mongo
】> db.t2.remove({})
】> db.t2.find() //确认表内已经没有数据了,不然导入会失败
】> exit
]# mongoimport -d t1 -c t2 --type=json /root/t03.json 用json的格式导入,必须确认表内已经没有数据了
]# mongo
】> db.t2.find() 数据复原

用csv的格式导入:表里可以有数据
]# mongoimport -d t1 -c t2 --headerline --type=csv /root/t02.csv
//必须指定文件的列名,不然不成功 -f和–headerline不能一起用 --headerline:把第一行的字段隐藏即去掉文件列的标题name,不然标题也会导进去,导入时t2集合可以不存在.

实验1:把/ect/passswd/以csv格式导入mongodb 数据库中。
第一步,先查看csv文件存储数据格式,已经导出数据的格式。(先要新建好需要的表)
】> use mdb
】> db.user.save({name:“yaya”,password:“x”,uid:“222”,gid:“666”,comment:“admin user”,homdir:"/home/yaya",shell:"/bin/bash"})
】> db.user.find()
{ “_id” : ObjectId(“5cde27745234d4bb4a2197f3”), “name” : “yaya”, “password” : “x”, “uid” : “222”, “gid” : “666”, “comment” : “admin user”, “homdir” : “/home/yaya”, “shell” : “/bin/bash” }
]# mongoexport --host 192.168.4.61 --port 27061 -d mdb -c user -f name,password,uid,gid,comment,homdir,shell --type=csv -o /tmp/user.csv //导出数据,-f 一定要把字段名列出来
]# cat /tmp/user.csv
name,password,uid,gid,comment,homdir,shell
yaya,x,222,666,admin user,/home/yaya,/bin/bash
第二、因此需要把/etc/passwd里面的 “ :” 改为 “,”。
】#cp -r /etc/passwd /tmp/
】sed -i ‘s/😕,/g’ /tmp/passwd
】cat /tmp/passwd
]# sed -i ‘$r/tmp/passwd’ /tmp/user.csv //读完/tmp/user.csv后继续读取/tmp/passwd。
]# vim /tmp/user.csv
]# mongoimport --host 192.168.4.61 --port 27061 -d mdb -c user --headerline --type=csv /tmp/user.csv
导入数据成功,下面查看数据库里是否存在数据
]# mongo -host 192.168.4.61 -port 27061
】> use mdb
】> db.user.find() 数据存在,默认只显示20行数据
Type “it” for more (输入it 会显示下面20行)

实验2:条件查找find({条件},{定义的字段}) (字段后面 1表示显示,0表示不显示)
】> db.user.find({},{name:1})
】> db.user.find({},{shell:1})
】> db.user.find({name:“root”},{_id:0,name:1,shell:1})
】db.user.find({name:/^a/},{_id:0,name:1,shell:1})
】> db.user.findOne({name:/^a/},{}) 正则表达式
】db.user.find({name:/^a/},{name:1}).skip(1) 跳过第一行
】db.user.find({name:/^a/},{_id:1,name:1,uid:1}).sort({uid:1}) 升序排列
】 db.user.find({name:/^a/},{_id:1,name:1,uid:1}).sort({uid:-1}) 降序排列
】db.user.find({name:/^a/},{_id:1,name:1,uid:1}).limit(2) 限制行数

实验三:条件判断
】db.user.find({uid:{$in:[1,6,9]}},{_id:1,name:1,uid:1}) KaTeX parse error: Expected 'EOF', got '}' at position 30: …ror: Expected '}̲', got 'EOF' at…nin:[1,6,9]}},{_id:1,name:1,uid:1}) KaTeX parse error: Expected 'EOF', got '}' at position 30: …ror: Expected '}̲', got 'EOF' at…or:[{name:“root”},{uid:2}]},{_id:1,name:1,uid:1})

实验四:数值比较
$ lt \ $lte \ $ gt \ $gte \ $ne
] db.user.find({uid:{ gte:10,gte:10,gte:10,gte:10,gte:10, gte:10,gte:10,gte:10,gte:10,gte:10,lte:40}},{_id:1,name:1,uid:1})
】db.user.save({name:null,uid:null}) 插入空值

</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e44c3c0e64.css" rel="stylesheet">
</div>
</article>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐