一、MongoDB安装
目录
官网:https://www.mongodb.com/
手册:https://docs.mongodb.org/manual/
非结构型数据库。没有行、列的概念。用JSON来存储数据。
集合就相当于“表”,文档就相当于“行”。
1、下载并解压,找到相应的版本系统,双击进入得到以下
2、创建存放数据目录:F:\mongodb\data
3、在cmd中进入安装目录:F:\mongodb-win32-i386-2.6.6\bin;
执行开启mongodb服务命令:
f:cd f:\mongodb-win32-i386-2.6.6\bin 回车
mongod -dbpath "F:\mongodb\data" 回车
4、执行命令后,显示服务信息,标示mongoDB成功。
5、开启另外一个cmd,开启新的cmd窗口。
输入命令进行测试:
f:cd f:\mongodb-win32-i386-2.6.6\bin
mongo
二、MongoDB的使用
版本:mongoDB 3.4.15
D:\aaa\db\mongodb3.4.15\bin
D:\aaa\db\mongodb3.4.15\data
开机命令:
mongod --dbpath D:\aaa\db\mongodb3.4.15\bin
我本机为:mongod --dbpath D:\aaa\db\bin
那么我们就能在系统的任何盘符,使用mongo命令了:
mongo 使用数据库 mongod 开机 mongoimport 导入数据
数据导入(整个数据库): 将源代码目录下sql文件夹(acltest.dmp/acltest)的内容,拷贝到mongodb安装目录的bin目录下, 命令行方式进入mongodb安装目录的bin目录下,运行 mongorestore -d acltest acltest.dmp/acltest,将数据导入acltest表
|
详解: mongoimport --db test --collection restaurants --drop --file primer-dataset.json
-db test 想往哪个数据库里面导入
--collection restaurants 想往哪个集合中导入
--drop 把集合清空
--file primer-dataset.json 哪个文件
数据导出(单个表):D:\aaa\db\mongodb3.4.15\bin>mongoexport -d iflashbuy_log -c area -o c:\area.dat |
参数说明:
-d 指明使用的库, 本例中为” iflashbuy_log”
-c 指明要导出的表, 本例中为”area”
-o 指明要导出的文件名及目录, 本例中为”area.dat”
从上面可以看到导出的方式使用的是JSON 的样式
例子:
数据导出(整个数据库): D:\aaa\db\mongodb3.4.15\bin> mongodump -h 127.0.0.1:27017 -d acltest -o c:\area.da |
参数说明:
-h: MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d: 需要备份的数据库实例,例如:test
-o: 备份的数据存放位置,例如:/home/mongodump/,当然该目录需要提前建立,这个目录里面存放该数据库实例的备份数据。
例子:
三、命令行操作
命令大全:
MongoDB常用操作命令大全 - CSDN博客
https://blog.csdn.net/piaocoder/article/details/52384756
要管理数据库,必须先开机,开机使用mongod --dbpath c:\mongo
管理数据库:mongo (一定要在新的cmd中输入)
列出所有数据库:show dbs
使用某个数据库:use 数据库名字 (不存在,则创建)
查看当前所在数据库:db
清屏:cls
查看所有的表:show collections
查看表中的数据:db.users.find()
如果真的想把这个数据库创建成功,那么必须插入一个数据。
数据库中不能直接插入数据,只能往集合(collections)中插入数据。不需要创建集合,只需要写语法:
1 db.student.insert({“name”:”xiaoming”}); |
db.student 系统发现student是一个陌生的集合名字,所以就自动创建了集合。
删除数据库,删除当前所在的数据库
1 db.dropDatabase(); |
查找数据:
查找数据,用find。find中没有参数,那么将列出这个集合的所有文档:
1 db.restaurants.find() |
精确匹配:
1 db.student.find({"score.shuxue":70}); |
多个条件:
1 db.student.find({"score.shuxue":70 , "age":12}) |
大于条件:
1 db.student.find({"score.yuwen":{$gt:50}}); |
或者。寻找所有年龄是9岁,或者11岁的学生
1 db.student.find({$or:[{"age":9},{"age":11}]}); |
查找完毕之后,打点调用sort,表示升降排序。
1 db.restaurants.find().sort( { "borough": 1, "address.zipcode": 1 } ) |
查询条件:
修改数据
修改里面还有查询条件。你要该谁,要告诉mongo。
查找名字叫做小明的,把年龄更改为16岁:
1 db.student.update({"name":"小明"},{$set:{"age":16}}); |
查找数学成绩是70,把年龄更改为33岁:
1 db.student.update({"score.shuxue":70},{$set:{"age":33}}); |
更改所有匹配项目:"
By default, the update() method updates a single document. To update multiple documents, use the multi option in the update() method.
1 db.student.update({"sex":"男"},{$set:{"age":33}},{multi: true}); |
完整替换,不出现$set关键字了:
1 db.student.update({"name":"小明"},{"name":"大明","age":16}); |
四、更改字段类型
1、字段类型判断
db.tb_name.find({"status":{$type:"double"}).count() //所有的status字段类型为Double类型的
db.tb_name.find({"status":{$type:1}).count() //所有status字段类型为Double类型的
字段类型转换:
- 数据类型批量转换(double转为int32):
- db.tb_name.find({"status":{$type:1}}).forEach(function(x){x.status=NumberInt(x.status);db.tb_name.save(x)})
- (string转为array):
- db.log.find({"record":{$type:2}}).forEach(function(x){x.record=Array(x.record);db.log.save(x)})
五、MongoDB索引
索引基础
- 索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更快。MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧。
下面是创建索引的命令:
db.user.ensureIndex({"username":1})
获取当前集合的索引:
db.user.getIndexes()
删除索引的命令是:
db.user.dropIndex({"username":1})
2.在 MongoDB 中,我们同样可以创建复合索引,如:
数字 1 表示 username 键的索引按升序存储,-1 表示age 键的索引按照降序方式存储。
db.user.ensureIndex({"username":1, "age":-1})
该索引被创建后,基于 username 和 age 的查询将会用到该索引,或者是基于 username 的查询也会用到该索引,但是只是基于 age 的查询将不会用到该复合索引。因此可以说, 如果想用到复合索引,必须在查询条件中包含复合索引中的前 N 个索引列。然而如果查询条件中的键值顺序和复合索引中的创建顺序不一致的话,MongoDB 可以智能的帮助我们调整该顺序,以便使复合索引可以为查询所用。如:
db.user.find({"age": 30, "username": "stephen"})
随着集合的增长,需要针对查询中大量的排序做索引。如果没有对索引的键调用 sort,
MongoDB 需要将所有数据提取到内存并排序。因此在做无索引排序时,如果数据量过大以致无法在内存中进行排序,此时 MongoDB 将会报错。
唯一索引
- 在缺省情况下创建的索引均不是唯一索引。下面的示例将创建唯一索引,如:
db.user.ensureIndex({"userid":1},{"unique":true})
- 如果再次插入 userid 重复的文档时,MongoDB 将报错,以提示插入重复键,如:
db.user.insert({"userid":5})
db.user.insert({"userid":5})
E11000 duplicate key error index: user.user.$userid_1 dup key: { : 5.0 }
- 如果插入的文档中不包含 userid 键,那么该文档中该键的值为 null,如果多次插入类似的文档,MongoDB 将会报出同样的错误,如:
db.user.insert({"userid1":5})
db.user.insert({"userid1":5})
E11000 duplicate key error index: user.user.$userid_1 dup key: { : null }
- 如果在创建唯一索引时已经存在了重复项,我们可以通过下面的命令帮助我们在创建唯一索引时消除重复文档,仅保留发现的第一个文档,如:
- 先删除刚刚创建的唯一索引
db.user.dropIndex({"userid":1})
2、插入测试数据,以保证集合中有重复键存在。
db.user.remove()
db.user.insert({"userid":5})
db.user.insert({"userid":5})
3、重新创建唯一索引
db.user.ensureIndex({"userid":1},{"unique":true })
我们同样可以创建复合唯一索引,即保证复合键值唯一即可。如:
db.user.ensureIndex({"userid":1,"age":1},{"unique":true})
索引的一些参数
如果在为已有数据的文档创建索引时,可以执行下面的命令,以使 MongoDB 在后台创建索引,这样的创建时就不会阻塞其他操作。但是相比而言,以阻塞方式创建索引,会使整个创建过程效率更高,但是在创建时 MongoDB 将无法接收其他的操作。
db.user.ensureIndex({"username":1},{"background":true})
mongoose给字段添加索引的方法:
在定义schema的时候
1表示升序索引,-1表示降序索