MongoDB数据库

目录

一 引入

  安装后注意事项

二 MongoDB的基本操作

练习

 三 文档之间的关系

 四 Mongoose

五 Model的方法

六 Document方法

七 Mongoose的模块化


一 引入

程序都是在内存中运行的,如果程序运行结束或者计算机断电,程序运行中的数据都会丢失。
所以我们就需要将一些程序运行的数据持久化到硬盘之中,以确保数据的安全性。而数据库就是数据持久化的最佳选择。

数据库主要分成两种:
(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的基本操作

在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

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("插入成功");
    }
})

五 Model的方法

(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])
                统计文档的数量

六 Document方法

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)
})

七 Mongoose的模块化

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值