目录
程序都是在内存中运行的,如果程序运行结束或者计算机断电,程序运行中的数据都会丢失。
所以我们就需要将一些程序运行的数据持久化到硬盘之中,以确保数据的安全性。而数据库就是数据持久化的最佳选择。
数据库主要分成两种:
(1)关系型数据库(RDBMS)
● MySQL、Oracle、 DB2、 SQL Server...
● 关系数据库中全都是表(2)非关系型数据库(NoSQL Not Only SQL)
●MongoDB、Redis......
● 键值对数据库
●文档数据库MongoDB
MongoDB是为快速开发互联网Web应用而设计的数据库系统。
MongoDB的设计目标是极简、灵活、作为Web应用栈的一部分。
MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,简单理解MongoDB这个数据库中存的是各种各样的JSON。( BSON )下载地址:https://www.mongodb.org/dl/win32/
MongoDB的版本偶数版本为稳定版,奇数版本为开发版。
MangoDB对于32位系统支持不佳,所以B.2版本以后没有再对32位系统的支持。
打开cmd命令行窗口输入
32位注意:
启动服务器时,需要输入如下内容mongod --storageEngine=mmapv1
在命令行窗口自行设置 数据库路径与端口号:
mongod --dbpath 数据库路径 --port 端口号
要操作数据库必须先启动服务器(mongod用来启动服务器),MongoDb 4. 0版本以上在安装的时候已经设置自动启动了。
客户端用来操作服务器,对数据进行增删改查的操作(mongo用来启动客户端)
我们下载的MongoDb是数据库服务器,可以包含多个数据库(database),一个数据库可以存放多个集合(collection),集合里可以有多个文档(document),文档是数据库中的最小单位,我们存储和操作的内容都是文档。
在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合
基本指令:
show dbs
show databases
-显示当前的所有数据库
use 数据库名
-进入到指定的数据库中.
db
- db表示的是当前所处的数据库
show collections
-显示数据库中所有的集合
数据库的CRUD (增删改查)的操作
以下的colection表示集合名:
(1)向集合中插入文档:db.集合名.insert (doc)
db. collection. insertOne():插入一个文档对象
db. collection. insertMany ():插入多个文档对象(参数为数组)
- //插入一个
- db.stus.insert({name:"八戒",age:28, gender:"男"});
- //插入多个
- db.stus.insert([
- {name: "张三",age:38,gender:"男"},
- {name:"亚梦" ,age:16,gender:"女"} ,
- {name: "米业",age:14,gender:"女"}
- ]) ;
- /*当我们向集合中插入文档时,如果没有给丈档指定_ id美性, 则数据库会自动为文档添加_ id,该属性用来作为文档的唯一标识
- _id我们可以自己指定,如果我们指定了数据库就不会再添加了,如果自己指定_ id 也必须保证它的唯一性
- */
- // 生成_id
- ObjectId()
(2)查询当前集合中的所有的文档:db.collection.find ()
find()用来查询集合中所有符合条件的文档,返回的是一个数组
find()可以(非必须)接收一个对象作为条件参数:{属性:值},查询属性是指定值的文档,可指定多个,之间用逗号连接,参数为{ }表示查询集合中所有的文档。
db. collection. findOne ():用来查询集合中符合条件的第一个文档
findOne ()返目的是一个文档对象
db.collection. find({ }) .count ()查询所有结果的数量
(3)修改:db. collection. update (查询条件,新对象)
update ()默认情况下会使用新对象来替换旧的对象
db. stus .update ({name: "沙和尚"}, {age:28}) ;
如果需要修改指定的属性,而不是替换需要使用"修改操作符"来完成修改:
1) $set 可以用来修改文档中的指定属性
- db.stus.update(
- {"name" : 亚梦},
- {$set: {
- gender:20
- }},
- // update()默认只改一个
- //添加下面的就可以修改多个符合条件的
- {
- multi:true
- )
- )
2)$unset可以用来删除文档的指定属性
- //要删除的属性,它的值任意
- db.stus.update(
- {"name" : 亚梦},
- {$unset:{
- age:1
- }}
- )
db. collection.updateMany ()--->同时修改多个符合条件的文档
db. collection.updateOne ()--->修改一个符合条件的文档
db. collection.replaceOne ()---->替换一个文档
(4)删除
db. collection. remove ()---->删除符合条件的所有的文档(默认情况下会删除多个)
remove ()可以根据条件来删除文档,传递的条件的方式和find()-样
如果remove ()第二个参数传递一个true,则只会删除一个
如果只传递一个空对象作为参数,则会删除集合中的所有文档
db. collection. deleteOne ()--->删除一个
db. collection. deleteMany ()--->删除多个
db.collection.drop() 删除集合
db. dropDatabase () 删除数据库
-般数据库中的数据都不会删除,所以删除的方法很少调用
一般会在数据中添加一个字段(isDel),来表示数据是否被删除
- db.jihe.insert([
- {
- name:"zs",
- isDel:0
- },
- {
- name:"lisi",
- isDel:0
- },
- {
- name:"wangwu",
- isDel:0
- }
- ]);
- db.jihe.updateOne({name:"lisi"},{$set:{isDel:1}});
- db.jihe.find({isDel:0})
MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是一个文档时,我们称这个文档叫做 内嵌文档
- /*1 向username为bj的文档中添加一个
- hobby:{cities : [ "beijing", "shanghai", "shenzhen"],movies:["sanguo", "hero"] }
- */
- db.users.update(
- {username:"bj"},
- {$set:{hobby:{cities:[ "beijing", "shanghai", "shenzhen"],movies:["sanguo", "hero"] }
- }
- });
- //2查询喜欢电影hero的文档
- /*MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过.的形式来匹配
- 如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号*/
- db.users.find({'hobby.movies':"hero"});
- //3向username为bj中添加一个新的电影Interstellar
- //$push用于向敷组中添加一个新的元素
- //$addToSet向数组中添加一个新元素 ,如果数组中已经存在了该元素,则不会添加
- db.users.update ({username:"bj"}, {$push:{"hobby.movies":"Interstellar"}}) ;
- //db.users.update ({username:"bj"}, {$addToSet: {"hobby.movies":"Interstellar"}})
- //4.删除喜欢beijing的用户
- db.users.remove({"hobby.cities":"beijing"});
- //向numbers中添入20000条数据
- var arr=[];
- for(var i=1;i<=20000;i++){
- arr.push({num:i});
- }
- db.numbers.insert(arr);
- //查询numbers中num大于5000的文档
- db.numbers.find({num:{$gt:500}}) ;
- //查询numbers中num等于5000的文档
- db.numbers.find({num:{$eq:500}}) ;
- //查询numbers中num小于30的文档
- db.numbers.find({num:{$lt:30}}) ;
- //查询numbers中num大于40小于50的文档
- db.numbers.find({num:{$gt:40,$lt:50}}) ;
- //查询numbers中num小于20或大于50的文档
- db.numbers.find({
- $or:[{num:{$lt:20}},{sal:{$gt:50}}]
- })
- //为所有num小于20的增加30(如果是减30则把30改为-30)
- db.numbers.updateMany({num:{$lt:20}},{$inc:{num:30}});
- // limit()设置显示数据的展示
- db.numbers.find().limit (10) ;
- //查询11到20条数据
- //skip()用于跳过指定数量的数据,skip((页码-1) *每页显示的条数).limit(每页显示的条数);
- //MongoDB会自动调整skip和limit的位置
- db.numbers.find().skip(10).limit(10)
-
(1)一对一
- db. wi feAndHusband. insert ([
- {
- name:"黄蓉" ,
- husband: {
- name:"郭靖"
- }
- },
- {
- name:"潘金莲",
- husband: {
- name: "武大郎"
- }
- }
- ])
-
(2)一对多
- db.users.insert ([{
- username:"swk"
- }, {
- username:"zbj"
- }]) ;
- db.order.insert([
- {
- list:["苹果","香蕉"],
- //swk的id
- user_id:ObjectId("62f63f1ba51086bb19a54cf0")
- },
- {
- list:["牛肉"],
- //bj的id
- user_id:ObjectId("62f63f1ba51086bb19a54cf1")
- }])
- //查找swk的订单
- var user_id=db.users.findOne({username:"swk"})._id;
- db.order.find({user_id:user_id});
(3)多对多
- db.teachers.insert([
- {name:"老师一"},
- {name:"老师二"},
- {name:"老师三"}
- ]);
- db.stus.insert([
- {
- name:"学生一",
- tech_ids:[ObjectId("62f62cf6a51086bb19a54ced"),ObjectId("62f62cf6a51086bb19a54cee")]
- }
- },{
- name:"学生二",
- //老师一、二、三的_id
- tech_ids:[ObjectId("62f62cf6a51086bb19a54ced"),ObjectId("62f62cf6a51086bb19a54cee"),
- ObjectId("62f62cf6a51086bb19a54cef")]
- }
- ]);
补充:查询文档时,默认情况是按照_id的值进行排列(升序)
sort ()可以用来指定文档的排序的规则,sort ()用要传递一个对象来指定排序规则,参数为{属性:1}表示升序,{属性:-1} 表示降序
//先按照sal升序排列,再对sal相同的按照empno降序排列 db.emp.find({}).sort({sal:1, empno:-1}) ;limit skip sort可以以任意的顺序进行调用
mongoose的好处:
●可以为文档创建一个模式结构( Schema )
●可以对模型中的对象/文档进行验证
●数据可以通过类型转换转换为对象模型
●可以使用中间件来应用业务逻辑挂钩
●比Node原生的MongoDB驱动更容易
mongoose中为我们提供了几个新的对象
一Schema(模式对象)
Schema对象定义约束了数据库中的文档结构
一Model
Model对象作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection
一Document
Document表示集合中的具体文档,相当于集合中的一个具体的文档
连接数据库基本步骤:
1.下载安装Mongoose
npm i mongoose --save
2.在项目中引入mongoose
const mongoose = require ( "mongoose") ;
3.连接MongoDB数据库
mongoose.connect ( 'mongodb://数据库的ip地址:端口号/数据库名')
如果端口号是默认端口号(27017) 则可以省略不写
4 断开MongoDB数据库(一般不需要调用)
MongoDB数据库,一般情况下, 只需要连接-次,连接-次以后,除非项目停止服务器关闭,否则连接-般不会断开
mongoose. disconnect ()
监听MongoDB数据库的连接状态:
在mongoose对象中, 有一个属性叫做connection,该对象表示的就是数据库连接
通过监视该对象的状态,可以来监听数据库的连接与断开
数据库连接成功的事件
mongoose. connection. once ("open", function() {}) ;
数据库断开的事件
mongoose. connction. once ("close", function() {}) ;
- const mongoose=require("mongoose");
- const { Schema } = mongoose;
- mongoose.connect("mongodb://localhost:27017/mymongose");
- mongoose.connection.once("open",function(){
- console.log("数据库连接成功")
- })
- mongoose.connection.once("close", function() {
- console. log ("数据库连接已经断开~~~");
- }) ;
-
- //创建schema (模式)对象
- const stuschema = new Schema({
- name: String,
- age : Number,
- gender: {
- type:String,
- //默认值
- default: "female"
- },
- address: String
- }) ;
- //通过schema,来创建Model
- //Model代表的是数据库中的集合,通过Model才能对数据库进行操作
- //mongoose.model (modelName, schema) :
- //modelName 就是要映射的集合名 mongoose会自动将集合名变成复数
- const StuModel = mongoose.model("student",stuschema);
- //向数据库中插入一个文档
- //StuMode1. create (doc, function(err) {}) ;
- StuModel.create({
- name: "小明",
- age: 19,
- gender: "male",
- },function(err){
- if(!err){
- console.log("插入成功");
- }
- })
(1)Model. create (doc(s),[callback])
-用来创建一个或多个文档并添加到数据库中
-参数:
doc(s) 可以是一个文档对象,也可以是一个文档对象的数组
callback当操作完成以后调用的回调函数
(2)Model. find (conditions, [projection], [options], [callback])
-查询所有符合条件的文档,总会返回一个数组
Model. findById(id, [projection], [options], [callback])
-根据文档的id属性(不用带ObjectId)查询文档,总会返回一个文档对象
Model. findOne ([conditions],[projection], [options], [callback].
-查询符合条件的第一个文档,总会返回一个文档对象
conditions查询的条件
projection投影 需要获取到的字段
两种方式:
{name:1,_id:0}
"nmae -_id"
- /查询结果只有名字
- //第一种方式
- /*StuModel.find({},{name:1,_id:0},function(err,docs){
- if(!err){
- console.log(docs);
- }
- })*/
- //第二种方式
- StuModel. find({}, "name -_id", function (err,docs) {
- if(!err) {
- console.log (docs) ;
- }
- }) ;
options查询选项 (skip limit)
callback回调函数,查询结果会通过回调函数返回
回调函数必须传,如果不传回调函数,压根不会查询
通过find()查询的结果,返回的对象,就是Document, 文档对象
Document对象是Model的实例,通过Model查询到结果都是Document
- StuModel.findById("62f716d63bf6858aee2dc8ae", function (err,doc) {
- if(!err) {
- console.log (doc instanceof StuModel) ;//true
- }
- }) ;
(3)Model. update (conditions, doc, [options], [calIback])
Model. updateMany (conditions, doc, [options], [callback])
Model. updateOne (conditions, doc, [options], [cal Iback])
一用来修改一个或多个文档
一参數:
conditions 查询条件
doc 修改后的对象
options 配置参数
callback 回调函数
- StuModel.updateOne({name:"小明"},{$set:{age:20}},function(err){
- if(!err){
- console.log("修改成功")
- }
- })
(4)Model . remove (conditions,[calIback] )
Model. deleteone (conditions, [callback])
Model. deleteMany (conditions,[callback] )
---删除
(5)Model. count (conditions, [callback])
统计文档的数量
- const mongoose=require("mongoose");
- const { Schema } = mongoose;
- mongoose.connect("mongodb://localhost:27017/mymongose");
- mongoose.connection.once("open",function(){
- console.log("数据库连接成功")
- })
- mongoose.connection.once("close", function() {
- console. log ("数据库连接已经断开~~~");
- }) ;
-
- //创建schema (模式)对象
- const stuschema = new Schema({
- name: String,
- age : Number,
- gender: {
- type:String,
- //默认值
- default: "female"
- },
- address: String
- }) ;
- const StuModel = mongoose.model("student",stuschema);
- //创建一个Document
- const stu=new StuModel({
- nmae:"heidou",
- age:15,
- gender:"male",
- address:"西南"
- })
- 1/*
- document的方法(吞服哦文档对象调用)
- Model #save ([options],[fn])
- */
- stu. save (function (err) {
- if(!err) {
- console. log ("保存成功~")
- }
- }) ;
- StuModel.findOne({},function(err,doc){
- /*
- update(update, [options], [callback])
- -修改对象
- remove ([callback])
- 一删除对象
- * */
- //修改的方式一
- /* doc.update({$set:{age:28}},function(err){
- if(!err){
- console.log("修改成功")
- }
- })*/
- //修改的方式二
- doc.age=18;
- doc.save();
-
- //删除
- /* doc.remove(function(err){
- if(!err){
- console.log("删除成功")
- }
- })*/
- /*
- get(name)
- ---获取文档中的指定属性值
- //console.1og (doc.get ("age"));
- //console. 1og (doc.age)
- set(name,value)
- ---设置文档的指定的属性值
- //doc. set ("name", "猪小小”) ;
- id
- -----获取文档的_id属性值
- //console.log(doc.id);
- //console.log(doc._id);
- */
-
- /*toObject()
- -将Document对象转换为 一个普通的JS对象,
- 转换为普通的js对象以后,注意所有的Document对象的方法或属性都不能使用1
- */
- doc=doc.toObject();
- delete doc.age;
- console.log(doc._id)
- })


