NoSQL 指的是非关系数据库。NoSQL 使用的最多的就是 key-value 存储,当然还有 xml 等类型。NoSQL 对于传统关系数据库的优点有:
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bjson 格式,因此可以存储比较复杂的数据类型。MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。
MongoDB 是绿色的,官网提供的安装包其实是将一些配置信息在安装阶段运行了。如果使用压缩文件,解压后需要进行配置。
可以创建一个文本文件,名称任意取。文件中的参数以 " 键 = 值 " 的格式进行存储,例如
#数据库数据存放目录
dbpath="D:\MongoDB\db"
#数据库日志存放目录
logpath="D:\MongoDB\logs\mongodb.log"
文件夹 bin 下的 mongod.exe 为主运行文件,在命令行里输入 mongod.exe -h 或 mongod.exe --help 则能看到参数及说明。
运行 MongoDB 时,必须添加的参数就是数据库路径了。通常还会添加一个日志文件路径:
mongod.exe --dbpath ./db --logpath ./logs/mogondb.log
执行完成后可以开个浏览器进行测试:在浏览器中输入http://localhost:27017/可看到返回信息:
It looks like you are trying to access MongoDB over HTTP on the native driver port.
如果看到这个信息说明程序正常运行。如果需要其他配置可以参考参数说明。
在命令行界面输入以下命令即可安装为服务,记得添加包括数据库路径在内的其他参数。
mongod.exe --serviceName MongoDB --install
安装完成后,可以在服务中看到,也可以手动运行服务 net start MongoDB 或手动停止服务 net stop MongoDB
如果不需要服务了,则可以进行卸载
mongod.exe --remove
| SQL | sql说明 | MongoDB | mongodb说明 |
|---|---|---|---|
| database | 数据库 | database | 数据库 |
| table | 数据表 | collection | 数据集合 |
| row | 行 | docunent or BSON document | 文档 |
| colunm | 列 | field | 字段 |
| index | 索引 | index | 索引 |
| primary key | 主键 | _id(auto set) | id(自动设置) |
| 类型 | 名称 |
|---|---|
| Object ID | 对象ID |
| String | 字符串,最常用,必须是有效的UTF-8 |
| Boolean | 布尔 |
| Integer | 整数 |
| Double | 浮点 |
| Arrays | 数组或列表,多个值存储到一个键 |
| Object | 用于嵌入式的文档对象,即一个值为一个对象 |
| Null | 存储Null值 |
| Timestamp | 时间戳 |
| Date | 当前日期或时间的UNIX时间格式 |
在连接之前先要运行 MongoDB,无论是本地服务运行还是命令行运行都行。第一次运行不要加 --auth 即不要进行登录验证。
运行完 MongoDB 就可以连接到 MongoDB 了。使用 bin 目录下的 mongo.exe 进行连接,如果没有过多的设置直接运行就行了,如果有设置 IP 和端口号,则需要以参数形式传入。
第一次连接上数据库,需要做的就是建立超级管理员账号。
use admin // 使用 admin 数据库
db.createUser({
user: 'admin', // 用户名(自定义)
pwd: 'Abc123++', // 密码(自定义)
roles:[{
role: 'root', // 使用超级用户角色
db: 'admin' // 指定数据库
}]
})
设置完成,可以通过指令 show users 查看是否设置成功。然后关闭 MongoDB 服务程序,以需要验证模式重新部署服务即可使用权限设置了。
如果忘记了超级管理员账号密码,可以以不需要认证的形式部署服务。这时连接到数据库不需要账号密码,使用 mongo.exe 连接到数据库。
use admin // 使用 admin 数据库
db.system.users.find() // 查看当前用户
db.system.users.remove({}) // 删除现有的用户
db.createUser({user:"admin",pwd:"Admin@123",roles:["root"]}) // 创建超级管理员账号
然后再开启验证重新部署服务就可以了。
使用 mongo.exe 连接到数据库后
use admin
db.auth('admin','Admin@123')
show dbs
use 数据库名
use 数据库名
db.dropDatabase()
集合相当于 sql 里的表
db.createCollection(集合名)
show tables
show collections
db.集合名称.drop()
首先需要明确的是 MongoDB 中数据是以 文档(document) 形式存在,相当于 sql 里的 row。通常 document 是以字典形式存在。在 MongDB 中,唯一的主键是 _id,它是数据创建时自动生成的(除非主动创建)。另外 MongoDB 是 没有表结构 一说的,上一条数据和下一条数据可以完全没有相同的字段,两个数据可以没有任何关联(除了都有**_id**)。
db.集合名称.insert(document)
db.集合名称.save(document)
增加多条数据使用字典列表:
db.集合名称.insert([{k1:v1},{k2,v2}]
db.集合名称.update({query},{update},{multi:false})
# 只更新找到的第一条数据,且会修改结构,结果
db.person.update({name:"zs"},{age:16})
# 只更新第一条数据,不修改文档结构
db.person.update({name:"zs"},{$set:{age:123}})
# 更新所有所有符合查询条件的数据
db.person.update({name:"zs"},{$set:{age:40}},{multi:true})
db.集合名称.remove(查询条件)
# 删除所有匹配数据
db.person.remove({name:"zs"})
# 只删除第一条匹配数据
db.person.remove({name:"zs"},{justOne:true})
# 不计条件删除全部
db.person.remove({})
db.集合名称.find(查询条件)
# 查询所有 name 为 zs 的数据
db.person.find({name:"zs"})
# 查询所有数据
db.person.find()
Mongo 支持的运算符有:
| 语法 | 操作 | 格式 |
|---|---|---|
| $eq | 等于 | {key:value} |
| $lt | 小于 | {key:{$lt:value}} |
| $lte | 小于等于 | {key:{$lte:value}} |
| $gt | 大于 | {key:{$gt:value}} |
| $gte | 大于等于 | {key:{$gte:value}} |
| $ne | 不等于 | {key:{$ne:value}} |
| $or | 或 | {$or:[{条件1},{条件2}]} |
| $and | 与 | {$and:[{条件1},{条件2}]} |
| $not | 非 | {$not:{条件}} |
| $nor | 或非(非取反) | {$nor:[{条件1},{条件2}]} |
| $exists | 键是否存在 | {key:{$exists:true|false}} |
| $in | 在列表中 | {key:{$in:[value1,value2]}} |
| $nin | 不在列表中 | {key:{$nin:[value1,value2]}} |
| $mod | 数字模操作 | {key:{$mod:[num1,num2]}} |
# 查询所有 age 的值 大于16 的数据
db.person.find({age:{$gt:16}})
# 查询所有 age 大于等于18 或 name 等于 'zs' 的数据
db.person.find({$or:[{age:{$gte:18}},{name:"zs"}]})
另外还可以根据某一个字段(key)的值的数据类型进行查询,使用 $type,格式为 {key:{$type:数据类型值}}。数据类型和其值可以参考下表
| 类型 | 数字 | 备注 |
|---|---|---|
| Double | 1 | |
| String | 2 | |
| Object | 3 | |
| Array | 4 | |
| Binary data | 5 | |
| Undefined | 6 | 已废弃 |
| Object id | 7 | |
| Boolean | 8 | |
| Date | 9 | |
| Null | 10 | |
| Regular Expression | 11 | |
| JavaScript | 13 | |
| Symbol | 14 | |
| JavaScript (with scope) | 15 | |
| 32-bit integer | 16 | |
| Timestamp | 17 | |
| 64-bit integer | 18 | |
| Min key | 255 | Query with -1. |
| Max key | 127 |
# 这两种方式等价
db.person.find({name:{$type:2}})
db.person.find({mame:{$type:'string'}})
mongo 没有 like ,而是使用正则表达式。使用 // 或 $regex 可以编写正则表达式
db.person.find({name:/^zs/})
db.person.find({name:{$regex:'^zs'}})
可以使用 $where 后面跟一个函数(JS的语法),则可以返回满足条件的数据
db.person.find({$where:function(){return this.age>20}})
可以使用 limit 将查询结果分页处理,用于读取指定数量的文档
db.集合名称.find(查询条件).limit(NUMBER)
使用 skip 跳过指定数量的文档,即前指定数量的文档在查询结果中不返回
db.集合名称.find(查询条件).skip(NUMBER)
使用 sort 可以对查询结果集按照字段进行排序,参数1为升序0为降序
db.集合名称.find().sort({key1:1|0,key2:1|0…})
使用 count 可以对查询结果集中的文档数据量进行统计
db.集合名称.find(查询条件).count()
当某一条数据某一的字段的值是字典时,可以进行使用点进行多级查询例如
# 文档为: {'name': {'first': 'Joe', 'last': 'Schome'}, 'age': 45}
# 查询姓名为 Joe Schmoe 的记录,以下2个方法是等价的
db.person.find({'name.first': 'Joe', 'name.last': 'Schome'})
db.person.find({'name':{'first': 'Joe', 'last': 'Schome'}})