MongoDB和mongoose学习笔记

MongoDB基础学习和mongoose学习笔记

本文仅作为作者的学习过程记录。

参考资料

MongoDB 概念解析 | 菜鸟教程 (runoob.com)

MongoDB CRUD操作_MonogDB 中文网

MongoDB聚合 - MongoDB-CN-Manual (mongoing.com)

MongoDB是一个基于分布式文件存储的数据库。它是一个非关系数据库。

MongoDB 将数据存储为一个文档。MongoDB是一个基于分布式文件存储的数据库。

NoSQL非关系型数据库,主要指那些非关系型的、分布式的,且一般不保证ACID的数据存储系统,主要代表MongoDB,Redis、CouchDB。

NoSQL提出了另一种理念,以键值来存储,且结构不稳定,**每一个元组都可以有不一样的字段,这种就不会局限于固定的结构,可以减少一些时间和空间的开销。**使用这种方式,为了获取用户的不同信息,不需要像关系型数据库中,需要进行多表查询。仅仅需要根据key来取出对应的value值即可。

安装教程

启动Mongodb服务_MongoDB中文网

现在的安装已经不需要自己再去创建data文件夹了。

服务的名称也在安装的时候创建好了。

MongoDB和mongoose学习笔记_第1张图片

MongoDB和mongoose学习笔记_第2张图片

只需要在配置环境变量path里面配置bin文件夹下的路径即可。

net start mongodb启动服务即可。

MongoDB使用教程

启动服务

使用mongod启动服务。

这里我已经将MongoDB服务器作为Windows服务运行了net start mongodb

如果需要修改端口等其他信息,先删除服务sc delete MongoDB,修改配置文件,在启动服务即可。

MongoDB和mongoose学习笔记_第3张图片

连接MongoDB

mongo

MongoDB和mongoose学习笔记_第4张图片

默认情况下是直接连接的,也就是说不需要密码,当然也可以创建密码,具体的还需要百度。

配置密码(保证安全)

MongoDB 设置用户名密码和数据库连接 - apegu - 博客园 (cnblogs.com)

建议直接用可视化开创建

推荐使用Robo3T

使用

mongo -u xxx -p 连接数据库

MongoDB的重要概念

MongoDB和mongoose学习笔记_第5张图片

MongoDB和mongoose学习笔记_第6张图片

从上图中,我们可以知道,一个mongdb服务可以创建很多个数据库。

文档(doucument)

文档其实类似于sql中的行。也就是数据库中最小的单位。在mongodb里面相当于一个一个对象。

集合(collection)

集合类似于sql中的table,它类似于js中的数组。

数据库

一个mongodb的服务可以创建很多的数据库。数据库就是一个仓库,里面可以放很很多的collection(集合)。一个项目一般只使用一个数据库。

常用命令

展示所有数据库

show dbs

show databases

这个只会显示有数据的数据库名

MongoDB和mongoose学习笔记_第7张图片

切换或者创建指定的数据库

use xxx

这是命令就是用来切换数据库的,如果该数据库不存在,那么自动创建一个数据库

MongoDB和mongoose学习笔记_第8张图片

显示当前所在的数据库

db

image-20211114201835269

删除数据库

要删除数据那,说要需要切换到需要删除的数据下。

db.dropDatabase();

MongoDB和mongoose学习笔记_第9张图片

创建集合

语法

db.createCollection(name,options);

MongoDB和mongoose学习笔记_第10张图片

MongoDB和mongoose学习笔记_第11张图片

创建带有参数的数据库

创建一个固定集合,最大容量为1024字节,最大的文档数为1000

image-20211115102957865

还有一种创建方式:当插入文档是,若集合不存在,那么自动创建该集合。

db.xxx.insert({“name”: “fjx”});

MongoDB和mongoose学习笔记_第12张图片

查看集合

show collections 或 show tables;

MongoDB和mongoose学习笔记_第13张图片

删除集合

语法

db.collection.drop(); 其中collection就是集合的名字。

返回值:如果删除成功则返回true,否则返回false

MongoDB和mongoose学习笔记_第14张图片

这里我们把t集合删除。

集合重命名

db.collectionName.renameColleciotn(“new name”);

插入文档

MongoDB 插入文档 | 菜鸟教程 (runoob.com)

文档的数据结构和 JSON 基本一样。

所有存储在集合中的数据都是 BSON 格式。

BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

语法

db.COLLECTION_NAME.insert(document)

db.COLLECTION_NAME.save(document) 已被废除

对于db.COLLECTION_NAME.insert(document)来说,若插入数据的主键已经存则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。

3.2 版本之后新增了 db.collection.insertOne() 和db.collection.insertMany()。

db.collection.insertOne() 用于向集合插入一个新文档,语法格式如下:

db.collection.insertOne(
   ,
   {
      writeConcern: 
   }
)

db.collection.insertMany() 用于向集合插入一个多个文档,语法格式如下:

db.collection.insertMany(
   [  , , ... ],
   {
      writeConcern: ,
      ordered: 
   }
)

参数说明:

  • document:要写入的文档。
  • writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
  • ordered:指定是否按顺序写入,默认 true,按顺序写入。

具体操作

使用insert()向users集合中插入一个用户,name:“fjx”,age:21.

MongoDB和mongoose学习笔记_第15张图片

使用insertOne()向users集合中插入一个用户,name: “zyw”, age:20

MongoDB和mongoose学习笔记_第16张图片

使用insertMany() 用于向集合插入一个多个文档

MongoDB和mongoose学习笔记_第17张图片

其他的就不在演示了,具体看文档。

更新文档

语法

update()、save()、updataOne()、updateMany()

update()

MongoDB和mongoose学习笔记_第18张图片

MongoDB和mongoose学习笔记_第19张图片

实例

MongoDB和mongoose学习笔记_第20张图片

其中_id是mongodb为我们自动生成的id。

如果不加$set,那么就是直接覆盖这条文档的内容。当然,也许在collection里面有很多的name:“zj”,这里只会找到第一条,如果想要修改所有符合条件的记录,那么就要{multi:true}

删除文档

db.collection.remove(查询条件)

MongoDB和mongoose学习笔记_第21张图片

官方推荐使用 deleteOne() 和 deleteMany() 方法。

如删除集合下全部文档:

db.inventory.deleteMany({})

删除 status 等于 A 的全部文档:

db.inventory.deleteMany({ status : "A" })

删除 status 等于 D 的一个文档:

db.inventory.deleteOne( { status: "D" } )
查询文档

db.collection.find(查询条件)
db.collection.findOne(查询条件)

MongoDB和mongoose学习笔记_第22张图片

条件操作

相当于是sql的where

运算符

在 mongodb 不能 > < >= <= !== 等运算符,需要使用替代符号

  • > 使用 $gt
  • < 使用 $lt
  • >= 使用 $gte
  • <= 使用 $lte
  • !== 使用 $ne
$gt -------- greater than  >

$gte --------- gt equal  >=

$lt -------- less than  <

$lte --------- lt equal  <=

$ne ----------- not equal  !=

$eq  --------  equal  =

查询年龄大于等于20的用户。

image-20211115133337869

查询年龄大于等于20且小于等于123的用户。

image-20211115133509938

逻辑运算

$in 满足其中一个即可

db.students.find({age:{$in:[18,24,26]}}) //   

$or 逻辑或的情况

db.students.find({$or:[{age:18},{age:24}]});

$and 逻辑与的情况

db.students.find({$and: [{age: {$lt:20}}, {age: {$gt: 15}}]});
正则表达式

条件中可以直接使用JS的正则语法

db.collection.find({name:/xxxx/});

MongoDB排序

db.COLLECTION_NAME.find().sort({KEY:1})

聚合和索引

看文档。

高级部分的学习直接看文档,边使用边学习。·

mongoose学习

(3条消息) Mongoose (快速入门)_程程.的博客-CSDN博客_mongoose

中文文档

Mongoose 5.0 中文文档 (mongoosejs.net)

英文文档

Mongoose v6.0.13: Getting Started (mongoosejs.com)

mongoose是mongoDB的一个对象模型工具,是基于node-mongodb-native开发的mongoDB的nodejs驱动(基于元素的nodejs的mongodb开发的),可以在异步的环境下执行。同时它也是针对mongoDB操作的一个对象文档模型(ODM)库,封装了mongoDB对文档的一些增删改查等常用方法,让nodejs操作mongoDB数据库变得更加容易。

安装和使用

mongoose - npm (npmjs.com)

在安装之前必须确保已经安装了nodejsMongoDB

安装mongoose包
yarn add mongoose
或者
npm i mongoose -S

MongoDB和mongoose学习笔记_第23张图片

引入mongoose包
const mongoose = require('mongoose');
连接数据库

如果设置的有密码的话,mongodb://username:pwd:127.0.0.1/project?authSource=admin

mongoose.connect("mongodb://127.0.0.1/project?authSource=admin");
监听连接数据
// 设置连接成功的回调函数, 连接成功以后就会执行对调里面的代码
mongoose.connection.on('open',() => {
    //console.log('连接数据库成功');
    // 创建文档结构对象(schema =>  模式)
    const userSchema = new mongoose.Schema({
        // 允许 的类型:http://mongoosejs.net/docs/schematypes.html
        userName: String,
        password: String,
        email: String,
        age: Number
    });
    // 创建文档模型对象 集合的名称    
    const userModel = mongoose.model('users',userSchema);
    // 对数据进行操作
    userModel.create({
        userName: "张三",
        password: "123124",
        age: 123
    }, (err,data)=>{
        if (err) throw err;
        console.log(data);
    });
})
批量插入数据
mongoose.connection.on("open",()=>{
    const starSchema = new mongoose.Schema({
        name:String,
        age: Number,
        tags:Array
    });
   	// 集合的名称若是单数,那么会自动转换为复数形式
    const starModel = mongoose.model("star",starSchema);
    starModel.insertMany([
        {
            name:'fjx',
            age:18,
            tags:["帅哥",'哈哈']
        },
        {
            name:'zyw',
            age:18,
            tags:["帅哥",'哈哈']
        },
        {
            name:'zt',
            age:18,
            tags:["帅哥",'哈哈']
        }
    ],(err,data)=>{
        if(err) throw err;
        console.log(data);
    })
})
删除

删除一条数据

SongModel.deleteOne({_id:'5dd65f32be6401035cb5b1ed'}, function(err, data){
    console.log(err);
    console.log(data);
});

批量删除

SongModel.deleteMany({author:'Jay'}, function(err, data){
    console.log(err);
    console.log(data);
});
更新

更新一条数据

SongModel.updateOne({author: 'JJ Lin'}, {author: '林俊杰'}, function (err, data) {
    console.log(err);
    console.log(data);
});

批量更新数据

SongModel.updateMany({author: 'Leehom Wang'}, {author: '王力宏'}, function (err, data) {
    console.log(err);
    console.log(data);
});
查询

查询一条数据

SongModel.findOne({author: '王力宏'}, function(err, data){
    console.log(err);
    console.log(data);
});
//根据 id 查询数据
SongModel.findById('5dd662b5381fc316b44ce167',function(err, data){
    console.log(err);
    console.log(data);
});

批量查询数据

//不加条件查询
SongModel.find(function(err, data){
    console.log(err);
    console.log(data);
});
//加条件查询
SongModel.find({author: '王力宏'}, function(err, data){
    console.log(err);
    console.log(data);
});
字段筛选
SongModel.find().select({_id:0,title:1}).exec(function(err,data){
    console.log(data);
});
数据排序
SongModel.find().sort({hot:1}).exec(function(err,data){
    console.log(data);
});
数据截取
SongModel.find().skip(10).limit(10).exec(function(err,data){
    console.log(data);
});

这只是对最基础的学习,更加深入的学习还需要不断的项目。

你可能感兴趣的:(nodejs,MongoDB,npm,前端,node.js,mongodb)