# MongoDB操作 ## 基本概念 ~~~sh 数据库(database) 集合(collection) 文档(document) -在MongoDB中,数据库和集合都不需要手动创建 当我们在创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合 ~~~ ## 基本指令 ### 显示数据库 ~~~sh # 显示所有数据库 show dbs show databases ~~~ ### 使用数据库 ~~~sh # 使用数据库 use test # 使用数据库 如果没数据也可以使用,在插入数据时创建数据库 ~~~ ### 查看集合 ~~~sh # 代表当前数据库 show collections # 查看数据库中有几个集合 ~~~ ## 数据库的CRUD操作 ### 插入 ~~~sh # 向数据库中插入文档 db..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..insertOne() # 插入多个对象,必须为多个 db..insertMany() ~~~ ### 查询 ~~~sh # 向数据库中查询文档 db..find({}) - 查询当前集合中的所有文档 - {} 标示查询文档中所有的文档 db.stus.find({}).count() db.stus.find({name:'孙悟空"})# 只返回一个数组 db.stus.findOne({name:'孙悟空"}) # 只返回一个文档对象 # ~~~ ### 修改 ~~~sh # 向数据库中修改 db..update 默认情况只改一条 db..update( ,multi=True) 增加multi可以修改多个属性 db..update(查询条件,新对象) #会用新值直接替换当前查询的数据 db..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..updateMany 匹配多少该多少 db.stus.updateMany({name:"孙悟空"}, {$set:{ # 使用set 仅匹配到的数据,仅改一条 name:"齐天大圣孙悟空"} }) ~~~ ### 删除 ~~~sh # 删除文档 db..remove({}) # 如果传递了一个空对象,集合内的文档全部删除, 由于一条一条删,因此效率较低 - 删除符合文件的所有文档(默认情况下删除多个) db..remove(查询结果,justOne=True) # 只删除一个 db..deleteOne() db..deleteMany() db..drop(); # 清空集合 效率高 #当集合被清空,数据库内没有集合,数据库一会被清空 - 删除符合文件的所有文档(默认情况下删除多个) db.dropDatabase() # 删除数据库 ~~~ ### 文档之间的关系 ~~~sh # 文档之间的关系 - 一对一 # 可以通过内嵌文档形式一对一的关系 - 一对多 / 多对一 # 可以通过内嵌文档形式一对多的关系 - 多对多 # 通过查询user表中的username获取id,根据 id获取order表中的商品信息 # 一对多 var user_id = db.user.findOne({username: 'swk'})._id; db.order.find ({ user_id: user_id}); # 多对多 ~~~ ### Sort 排序 ~~~sh # 查询文档,默认按照_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),故有此名。** 优点: ~~~sh # 可以为文档创建一个模式结构(Schema) # 可以对模型中的对象/文档进行验证 # 数据可以通过类型转换为对象模型 # 可以使用中间件来应用业务逻辑挂钩 # 比Node原生的MongoDB驱动更容易 ~~~ Mongoose ~~~sh # Schema 模式对象定义约束数据库的文档结构 # Model 对象作为集合中的所有文档的标示,相当于MongoDB数据库中的集合Colletion # Document 表示集合中的具体文档,相当于集合中的一个具体的文档 ~~~ 1. 下载安装Mongoose ~~~sh # -js npm i mongoose --save # python pip install pymongo pip install pymongoose ~~~