MongoDB操作
基本概念
数据库(database)
集合(collection)
文档(document)
-在MongoDB中,数据库和集合都不需要手动创建
当我们在创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合
基本指令
显示数据库
# 显示所有数据库
show dbs
show databases
使用数据库
# 使用数据库
use test # 使用数据库 如果没数据也可以使用,在插入数据时创建数据库
查看集合
# 代表当前数据库
show collections # 查看数据库中有几个集合
数据库的CRUD操作
插入
# 向数据库中插入文档
db.<collection>.insert(doc)
- 向集合中插入一个文档
- 例子: 向test数据库中的 stus集合中插入一个新的学生对象
- 如果我没给集合插入文档时没有指定_id,则会自动生成id
- 自动_id 会按机器码+时间戳进行生成,确保数据唯一
- 如果指定_id 数据库就不在添加,如果自己指定_id必须保证唯一性
{name:'孙悟空",age:18,gender:'male'}
db.stus.insert({name:'孙悟空",age:18,gender:'male'})
db.stus.insert({name:'猪八戒",age:18,gender:'male'})
db.stus.insert([
{name:'唐僧",age:20,gender:'male'},
{name:'孙悟空",age:20,gender:'male'},
{name:'猪八戒",age:18,gender:'male'},
])
# 插入一个对象
db.<collection>.insertOne()
# 插入多个对象,必须为多个
db.<collection>.insertMany()
查询
# 向数据库中查询文档
db.<collection>.find({})
- 查询当前集合中的所有文档
- {} 标示查询文档中所有的文档
db.stus.find({}).count()
db.stus.find({name:'孙悟空"})# 只返回一个数组
db.stus.findOne({name:'孙悟空"}) # 只返回一个文档对象
#
修改
# 向数据库中修改
db.<collection>.update 默认情况只改一条
db.<collection>.update( ,multi=True) 增加multi可以修改多个属性
db.<collection>.update(查询条件,新对象) #会用新值直接替换当前查询的数据
db.<collection>.updateOne(查询条件,新对象) #会用新值直接替换当前查询的数据
db.stus.update({name:"孙悟空"}, {name:500}) # 6.0会报错
# 如果要修改指定的属性,而不是替换,需要使用"修改操作符"来完成修改
# $set 可以修改文档中指定属性
# $unset: 可以用来删除文档指定属性,不管属性的值
db.stus.update({name:"孙悟空"},
{$set:{ # 使用set 仅匹配到的数据,仅改一条
name:500} })
db.stus.update({name:"孙悟空"},
{$unset:{
name:500} })
db.<collection>.updateMany 匹配多少该多少
db.stus.updateMany({name:"孙悟空"},
{$set:{ # 使用set 仅匹配到的数据,仅改一条
name:"齐天大圣孙悟空"} })
删除
# 删除文档
db.<collection>.remove({}) # 如果传递了一个空对象,集合内的文档全部删除, 由于一条一条删,因此效率较低
- 删除符合文件的所有文档(默认情况下删除多个)
db.<collection>.remove(查询结果,justOne=True) # 只删除一个
db.<collection>.deleteOne()
db.<collection>.deleteMany()
db.<collection>.drop(); # 清空集合 效率高 #当集合被清空,数据库内没有集合,数据库一会被清空
- 删除符合文件的所有文档(默认情况下删除多个)
db.dropDatabase() # 删除数据库
文档之间的关系
# 文档之间的关系
- 一对一 # 可以通过内嵌文档形式一对一的关系
- 一对多 / 多对一 # 可以通过内嵌文档形式一对多的关系
- 多对多
# 通过查询user表中的username获取id,根据 id获取order表中的商品信息
# 一对多
var user_id = db.user.findOne({username: 'swk'})._id;
db.order.find ({ user_id: user_id});
# 多对多
Sort 排序
# 查询文档,默认按照_Id的值进行升序排序
# sort()可以使用指定文档的升序排序,Sort()要传递一个对象来指定排序规则,1表升序 -1表降序
# 先按sal升序排序,在按empno:-1降序排序
# limit skip sort 可以按认识的顺序进行排序
db.emp.find({}).sort({sal:1,empno:-1})
# 查询时,可以在第二个参数设置查询结果的投影
db.emp.find({},{name:1}); # _id 默认都有
db.emp.find({},{name:1, _id:0 }); # _id 不显示
Mongoose ODM对象文档库
ODM是缩写自Object-Document Mapping(对象文档映射),因为相对关系数据库的表(TABLE),在MongoDB中叫做文档(Document),故有此名。
优点:
# 可以为文档创建一个模式结构(Schema)
# 可以对模型中的对象/文档进行验证
# 数据可以通过类型转换为对象模型
# 可以使用中间件来应用业务逻辑挂钩
# 比Node原生的MongoDB驱动更容易
Mongoose
# Schema 模式对象定义约束数据库的文档结构
# Model 对象作为集合中的所有文档的标示,相当于MongoDB数据库中的集合Colletion
# Document 表示集合中的具体文档,相当于集合中的一个具体的文档
下载安装Mongoose
# -js npm i mongoose --save # python pip install pymongo pip install pymongoose