一、MongoDB的认识
- MongoDB 是一个基于分布式文件存储的数据库。
- 由 C++ 语言编写,是一个开源数据库系统。
- 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
- MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
- MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。
- MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
- 在高负载的情况下,添加更多的节点,可以保证服务器性能。
二、关系型数据库(mysql)与非关系型数据库(mongodb)的区别
-
关系型数据库
1. 特性:
- 关系型数据库是指采用了关系模型来组织数据的数据库;
- 关系型数据库的最大特点就是事务的一致性
- 简单来说,关系模型指的就是二维表格模型,关系型数据库就是 由二维表及其之间的关联组成的数据组织.
2. 优点:
- 容易理解;
- 使用方便;
- 易于维护;
- 支持SQL,可用于复杂的查询
3. 缺点:
- 为了维护一执行需要消耗大量的性能,影响读写
- 固定的表结构
- 高并发读写需求
- 海量数据的高效率读写 -
非关系型数据库:
1. 特性:
- 使用键值对存储数据
- 分布式
- 不支持ACID特性
- 非关系型数据库严格上来说,不算是一种数据库,应该是一种数据结构化存储方法的集合
2. 优点:
- 无需经过sql层的解析,读写性能高;
- 基于键值对,数据没有耦合性,容易扩展;
- 存储数据的格式,nosql使用key:val的形式,文档的形式,图片形式等等,而关系型数据库则只支持基础类型
3. 缺点:
- 不提供sql支持,学习成本高
- 无事务处理,附加功能和报表支持也不好
三、下载,安装和连接
- 下载
- 连接mongoDB数据库
- 2.1. 在任意盘符下创建新文件夹(data),在新文件夹内,再创建新文件夹(db)
- 2.2. 在安装目录中进入bin文件夹,打开命令提示符(命令提示符中路径必须为当前bin目录,最好以管理员方式打开命令提示符)
- 在命令提示符中输入:mongod --dbpath d:\data\db (在出现的众多提示中,如果出现:waiting for connections on port 27017。表示连接成功)
- 切记:当前命令提示符不要关闭,重新在bin目录下打开一个命令提示符
- 在新打开的命令提示符中输入:mongo。进入mongo操作状态
- 开始mongodb数据库的命令操作
四、mongoDB的常用指令
- 数据库操作:
use dbName
//创建并选择:(有则选,无则建)
db
//查看当前数据库
show dbs
//查看所有数据库
db.getMongo()
//查看数据库的链接地址
db.version()
//查看数据库的版本信息
db.getName()
//查看当前数据库名称
db.dropDatabase()
//删除数据库 -- 慎用
- 集合的操作
//1.创建集合
db.createCollection(name, options)
//name:集合名,字符
//options:可选,为对象
//2.删除集合
db.colName.drop()
//3.查看所有集合
show collections
//4.查看当前集合名称
db.getCollectionNames()
- 数据的操作
// 1. 增
插入单条:db.colName.insert({})
插入多条:db.colName.insert([{},{},...])
插入单条:db.colName.insertOne({})
插入多条:db.colName.insertMany([{},{},…]) *
//2.删
根据指定的键值对条件:
删除单条数据:db.colName.deleteOne({key:val})
删除多条数据:db.colName.deleteMany({key:val})
删除所有数据:db.colName.deleteMany({})
//3.改
根据指定的键值对条件:
修改单条数据:db.colName.updateOne({key:val},{$set:{key1:newVal,key2:newVal}})
修改多条数据:db.colName.updateMany({key:val},{$set:{key1:newVal,key2:newVal}})
Num为正自增,为负自减
自增/自减单条数据:db.colName.updateOne({key:val},{$inc:{key1:num}})
自增/自减多条数据:db.colName.updateMany({key:val},{$inc:{key1:num}})
- 数据的操作----查
//1.基本查询所有数据:
db.colName.find()
//2.格式化查询所有数据:
db.colName.find().pretty()
//3.指定键值对条件查询:
db.colName.find({key:val})
//4.指定条件查询(可以为{}表示所有数据),并限制字段显示:
db.colName.find({key:val},{userName:1, pass:1})
inclusion模式,指定返回的键,不返回其他键
db.colName.find({key:val},{userName:0, pass:0})
exclusion模式,指定不返回的键,返回其他键
注意:_id默认返回,如果不需要,需主动设置_id:0
//5.分页查询:
db.colName.find({key:val}).limit(num).skip(start)
num:表示个数
start:表示起始索引,默认为0
//6.排序查询:
db.colName.find({key:val}).sort({key:1})
1升序,-1降序
//7.区间查询: - 价格区间
db.colName.find({ key: {$lt:val1, $gt:val2} })
小于val1,大于val2
db.colName.find({ key: {$lte:val1, $gte:val2} })
小于等于val1,大于等于val2
//8.模糊查询: - 搜索
db.colName.find({ key: /val/})
查询key中包含val的数据
db.colName.find({ key: /^val/})
//9.查询key中包含val且以val开头的数据或查询: - 用户名或手机号登录
db.colName.find({ $or: [{key1:val1},{key2:val2}] })
//10.查询key1为val1或key2为val2的数据
且查询:
db.colName.find({ key1:val1, key2:val2 })
查询key1为val1且key2为val2的数据
//11.获取指定字段的数据: - 分类
db.colName.distinct("key")
获取指定字段的所有数据,去重并以数组的形式返回