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文件夹了。

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

image-20211113213815540

image-20211114181801639

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

net start mongodb启动服务即可。

MongoDB使用教程

启动服务

使用mongod启动服务。

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

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

image-20211114185644648

连接MongoDB

mongo

image-20211114194925881

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

配置密码(保证安全)

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

建议直接用可视化开创建

推荐使用Robo3T

使用

mongo -u xxx -p 连接数据库

MongoDB的重要概念

image-20211114192309256

image-20211114193014425

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

文档(doucument)

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

集合(collection)

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

数据库

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

常用命令

展示所有数据库

show dbs

show databases

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

image-20211114200633823

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

use xxx

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

image-20211114200910949

显示当前所在的数据库

db

image-20211114201835269

删除数据库

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

db.dropDatabase();

image-20211115102304738

创建集合

语法

db.createCollection(name,options);

image-20211115102553273

image-20211115102831248

创建带有参数的数据库

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

image-20211115102957865

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

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

image-20211115103637934

查看集合

show collections 或 show tables;

image-20211115103239049

删除集合

语法

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

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

image-20211115103919750

这里我们把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(
   <document>,
   {
      writeConcern: <document>
   }
)

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

db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)

参数说明:

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

具体操作

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

image-20211115120148239

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

image-20211115123933243

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

image-20211115125238466

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

更新文档

语法

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

update()

image-20211115130636186

image-20211115130643879

实例

image-20211115131111762

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

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

删除文档

db.collection.remove(查询条件)

image-20211115132311083

官方推荐使用 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(查询条件)

image-20211115132837134

条件操作

相当于是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

image-20211116103409270

引入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);
});

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值