MongoDB学习

本文详细介绍了MongoDB的下载安装、环境变量配置、启动连接,以及将其设置为系统服务的过程。讲解了如何使用图形化管理界面进行数据库管理,并深入探讨了MongoDB的CRUD操作、文档间关系。此外,文章还介绍了Mongoose的安装、使用和操作实例,包括创建Schema、模型、插入、查询、修改和删除文档,展示了在Node.js项目中使用Mongoose与MongoDB进行交互的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

下载及安装

配置环境变量

启动和连接服务器

将MongoDB设置为系统服务

图形化管理界面

MongoDB使用

数据库的CRUD(增删改查)操作:

向数据库中插入文档:

查询

修改 

删除:

补充:

文档之间的关系

 一对一(one to one)

 一对多(one to many)/多对一(many to one)

 多对多(many to many)

Mongoose

1.下载安装Mongoose,首先进入到你的代码目录下执行

2.在项目中引入mongoose

 3.连接MongoDB数据库

    4.断开数据库连接(一般不需要调用)

操作实例

创建Schema、model和插入文档代码:

 查询:

修改

删除

统计文档数量

Document

创建

插入

 修改

 删除

 其他常用方法:

Mongoose模块化


下载及安装

官网下载地址:https://www.mongodb.org/dl/win32/

下载后的msi文件,需要启动cmd的管理员模式进行安装,使用msiexec /i F:\MongoDB\安装包                \mongodb-win32-x86_64-2008plus-ssl-3.2.4-signed.msi命令进行安装(下载最新版本即可,         后续我发现以前下载版本的npm和mongodb都需要更新有的命令才能使用,因此下载最新版           本,不过安装方法和如下操作依然可用)

        

点击Custom自定义安装路径

配置环境变量

以win11为例:

        

        

点击高级系统设置

        

进入环境变量

在环境变量path中添加路径E:\MongoDB\bin(本人安装路径)

打开新cmd输入mongod出现下图所示内容即环境变量配置完成

启动和连接服务器

        

在C盘根目录下创建一个文件夹data,在data中创建一个文件夹db

在cmd中输入mongod启动mongodb服务器

        

最后出现waiting for connections on port 207017(端口号)即为服务器启动成功

再打开一个cmd输入mongo,出现如下图所示">"符号,即为连接服务器成功

        

32注意:第一次启动服务器时,需要输入mongod --storageEngine=mmapv1

可以使用”mongod --dbpath 路径 --port 端口号“ 来指定端口和数据库的路径(尽量选用4位以上的          端口号,最大不超过65535)

如:mongod --dbpath E:\MongoDB\data\db

将MongoDB设置为系统服务

将MongoDB设置为系统服务,可以自动在后台启动,不需要每次都手动启动

(在https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/可以看官方给出的配          置步骤)

1.在e盘已经创建好的data目录下创建log文件夹。

2.创建配置文件

找到安装的目录,如下图所示:(图中data目录为我自己创建的数据库)

在目录E:\MongoDB下添加一个配置文件mongod.cfg内容如下:

systemLog:
    destination: file
    path: c:\data\log\mongod.log
storage:
    dbPath: c:\data\db

        

        

3.以管理员身份打开命令行窗口

4.执行如下命令:

sc.exe create MongoDB binPath= "\"mongo bin路径\mongod.exe\" --service --

config=\"mongo 路径 \mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
以我的路径为例:
sc.exe create MongoDB binPath= "\"E:\MongoDB\bin\mongod.exe\" --service --
config=\"E:\MongoDB\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
出现如下图
        

后在资源管理器服务中启动

        

打开cmd,输入mongo

        

此时没有手动在cmd中启动MongoDB仍可连接到数据库,即为成功

5.如果在服务中启动失败,证明上面操作有误,在cmd输入sc delete MongoDB删除之前配置的服                务,然后从第一步再来一次

图形化管理界面

mangager for mongodb 安装:默认安装即可(不分64位或32位)

  (下载网址:Download NoSQL Manager for MongoDB)

点击shell即可编写代码,

写完后按F6可执行当前行的语句,F5执行所有语句,F9执行选中的语句

        

 在Document view可以查看图形化界面

        

在options中可调节中文字体 

        

如图所示方法可导入js文件

        

MongoDB使用

show dbs 或 show database    ——显示当前的所有数据库

        

use 数据库名        ——进入到指定的数据库中

        

db        ——查看当前所处的数据库

        

show collections         ——显示数据库中所有的集合

        

数据库的CRUD(增删改查)操作:

向数据库中插入文档:

db.<collection>.insert(doc)       

        ——向集合中插入一个或多个文档

        ——当我们向集合中插入文档时,如果没有给文档指定_id属性,则数据库会自动为文档添                    加 _id,该属性用来作为文档的唯一标识

        ——_id属性我们可以自己指定,如果我们指定了数据库就不会再添加,如果自己指定_id也                  必须确保它的唯一性(因此建议不自己指定)

 ——例子:向test数据库中的stus集合中插入一个新的学生对象{name:"张三",age:18,gender:"男}

        db.stus.insert({name:"张三",age:18,gender:"男})        

        

        

        

 db.collection.insertOne()        ——插入一个文档对象

 db.collection.insert.insertMany()        ——插入多个文档对象

查询

 db.<collection>.find()        ——查询当前集合中的所有的文档(默认按照_id的值进行排序)

                ——find()用来查询集合中符合条件的文档,可以接受一个对象作为条件参数,不指定条                         件时候就是查询所有文档,{字段名:值}查询字段是指定值的文档

                ——find返回的是一个数组

        

        

        

        

db.collection.findOne()            ——用来查询集合中符合条件的第一个文档

                ——返回的是一个文档对象

                                                                ​​​​​​​           

        

db.collection.find({}).count() 或 db.collection.find({}).length()       ——查询所有结果的数量

在查询时,可以在第二个参数的位置来设置查询结果的投影(默认_id显示)

        

若不想显示_id,可以如下图所示:

        

修改 

db.collection.update(查询条件,新对象)       

                ——update()默认情况下会使用新对象替换旧对象(有多个符合条件的值,默认只改一                               个值)

                ——如果需要修改指定的属性而不是替换,需要使用“修改操作符”来完成修改

                        $set 可以用来修改文档中的指定属性

                        $unset  可以用来删除文档的指定属性

 update默认修改一个值

        

用multi来修改多个值

        

替换属性:

        

        

修改属性:

        

删除属性:(属性后随便跟一个值即可删除)

        

        

db.collection.updateMany()        ——同时修改多个符合条件的文档

        

db.collection.updateOne()        ——修改一个符合条件的文档

db.collection.replaceOne()        ——替换一个符合条件的文档

删除:

db.collection.remove()        ——remove()可以根据条件来删除文档,传递条件的方式和find()一样

                ——会删除符合条件的所有文档(默认条件下删除多个)

                ——如果remove()第二个参数传递一个true,则只会删一个

                ——如果只传一个空对象为参数,则会删除集合中的所有文档

                ​​​​​​​        ​​​​​​​ 

               

第二个参数传递true,则只会删除一个符合条件的值

        

删除集合中的所有文档(清空集合,性能略差)

        

        

db.stus.drop()        ——删除集合

        

 ​​​​​​​        

如果删除后此时数据库中没有集合,数据库也会自动删除

        

db.collection.deleteOne()

db.collection.deleteMany()

db.dropDatabase()     ——删除数据库(先切换到要删除的数据库下,再进行删除)

注意:一般数据库中的数据不会被删除,所以删除的方法很少用,一般会在数据中添加一个字                          段,来表示数据是否被删除

例如添加一个属性isDelete:0,(0表示没删除,1表示删除),查询时增加isDelete:0的条件即可

补充:

 MongoDB中的文档的属性值也可以是一个文档,当一个文档的属性值是一个文档时,称这个文档          是内嵌文档

        

MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过.的形式进行匹                配。如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号

        

$push用于向数组中添加一个新元素,重复的元素也会添加

$addToSet向数组中添加一个新元素,如果数组中已经有该元素,则不会添加

        

删除喜欢beijing的用户

        

        

向numbers中插入20000条数据

        

改进方法(提升速度):

        

$gt         ——查询num大于指定的值

        

 $gte        ——查询大于等于指定的值

        

  $eq        ——查询等于指定的值

  $lt        ——查询小于指定的值

  $lte        ——查询小于等于指定的值

查询大于40小于50 的文档:

       查询小于1000或大于2500的员工:

limit()设置显示数据的上限 (可用于分页显示每页数据的数量)

        

skip()用于跳过指定数量的数据

        

$inc自增        ——为工资低于1000的员工,增加400工资(减400再400前加负号即可)

​​​​​​​

查询文档时,默认情况是按照_id的值来进行排序(升序)

sort()         ——可以用来指定文档的排序规则,需要传递一个对象来指定排序规则(传1升序、-1降序)

        

        

先按工资升序,工资相同时再按编号降序

        

limit()、skip()、sort()在同一语句出现时可以以任意的顺序进行调用

文档之间的关系

 一对一(one to one)

        ——在MongoDB中,可以通过内嵌文档的形式来体现出一对一关系

        例如:

 一对多(one to many)/多对一(many to one)

        ——也可以通过内嵌文档来映射一对多的关系

比如用户与订单

 

可以通过查找用户id来查看用户的订单,(find()返回的是数组,需指定数组下标)

        

        

 多对多(many to many)

 比如老师与学生

        

 ​​​​​​​        

Mongoose

(操作文档官网:Mongoose ODM v6.1.8

Mongoose就是一个让我们可以通过Node来操作MongoDB的模块

mongoose中为我们提供了几个新对象:

       ——Schema(模式对象):定义约束了数据库中的文档结构

       ——Model:作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection

        ——Document:表示集合中的具体文档,相当于集合中的一个具体文档

1.下载安装Mongoose,首先进入到你的代码目录下执行

        npm i mongoose --save

        

2.在项目中引入mongoose

        var mongoose =require("mongoose")

 3.连接MongoDB数据库

        mongoose.connect('mongodb://数据库的ip地址:端口号/数据库名',(useMongoClient:true));

            -如果端口号是默认端口号27017,则可以省略不写

    -监听Mongodb数据库的连接状态

        -在Mongoose对象种,有一个属性叫做connection,该对象表示的就是数据库的连接

            通过监听该对象的状态,可以来监听数据库的连接与断开

                       - 数据库连接成功的事件

                                mongoose.connection.once("open",function(){});

                        -数据库连接断开的事件

                                mongoose.connection.once("close",function(){});

    4.断开数据库连接(一般不需要调用)

        -MongoDB数据库,一般情况下,只需要连接一次。连接一次以后,除非项目停止服务器关闭,否则连接一般不会断开

            mongoose.disconnect()

        

 (127.0.0.1也可改为localhost)

操作实例

创建Schema、model和插入文档代码:

        

 ​​​​​​​        

        

        

运行结果

        

        

注意: mongoose会自动将集合名变成复数,因此定义的student查询时应为students

有了Model,我们就可以对数据库进行增删改查的操作了

 model.create(doc(s),{callback})

       -用来创建一个或者多个文档并添加到数据库中

       -参数:

           doc(s)  可以是一个文档对象,也可以是一个文档对象的数据

           callback    当操作完成后调用的回调函数

 ​​​​​​​        

 可用argument来查看回调函数的参数(“0”:null代表没出错(错误优先))

        

 查询:

      Model.find(conditions,[projection],[options],[callback])

          -查询所有符合条件的文档(总会返回一个数组)

      Model.findById(id,[projection],[options],[callback])

          -根据文档的id属性查询文档

      Model.findOne([conditions],[projection],[options],[callback])

          -查询符合条件的第一个文档(总会返回一个具体的文档对象)

        conditions        查询的条件

        projection        投影

                 -两种方式:

                         {name:1,_id:0}

                          "name   -_id"

        options        查询选项(skip,limit)

        callback        回调函数,查询结果会通过回调函数返回(因此必须传回调函数)

Model.find(conditions,[projection],[options],[callback])用法:

        

 (注意:返回的是个数组,若查询不到,则返回一个空数组。因此输出姓名时,应为doc[0].name)

(若查询条件为空,则表示查询所有的文档)

设置投影:

        

也可传字符串(注意此方法默认查询_id,若不想要_id,可在字符串中添加-_id)

        

        

 options选项用法:

        skip        跳过指定个数的数据

        

         limit        限制输出的结果数量

        

  Model.findOne([conditions],[projection],[options],[callback])用法:

 ​​​​​​​        

  Model.findById(id,[projection],[options],[callback])用法:

        

 注意:通过find()查询的结果,返回的对象,就是Document(文档对象),Document对象是                    Model的实例

检查doc是不是stuModel的实例

        

修改

        Model.update(conditions,doc,[options],[callback])

                        -options:{multi:true}        表示修改多个

        Model.updateManu(conditions,doc,[options],callback)

        Model.updateOne(conditions,doc,[options],[callback])

            -用来修改一个或多个文档

            -参数:

                conditions 查询条件

                doc 修改后的对象

                options 配置参数

                callback    回调函数

​​​​​​​ 

 Model.replaceOne(conditions,doc,[options],[callback])   -替换一个

删除

       Model.remove(conditions,[callback])

       Model.deleteOne(conditions,[callback])

       Model.deleteMany(conditions,[callback])

​​​​​​​

统计文档数量

 Model.count(conditions,[callback])  

        

Document

Document和集合中的文档一一对应

Documnet是Model的实例

通过Model查询到的结果都是document

创建

        

插入

Model#save([options],[fuction])                ((#代表对象的方法))

 ​​​​​​​        

 修改

方法一:

  updata(update,[options],[callback])

                ​​​​​​​ 

       

 方法二:

 ​​​​​​​                

        

 删除

 remove({callback})

        

 其他常用方法:

get()        -获取文档中的指定属性值

        

         也可直接通过.的形式获得属性值

        ​​​​​​​        

 set(name,value)     -设置文档的指定的属性值

        

         注意:数据库并没改变,因为没保存

        ​​​​​​​        

 id      -获取文档的_id属性值

        

 toObject()          -将Document对象转换为一个普通的JS对象  

                -转换为普通的JS对象以后,所有的Document对象的方法或属性偶不能再使用

        

         转换为普通JS对象的用法:

               ( 注意:以下均为在数据库中删除)

                没转换之前:(无法删除属性)

                        

                 转换为普通JS对象后可删除指定的属性:

                        

Mongoose模块化

创建一个conn_mongodb.js文件,定义连接数据库,写入如下内容

        

创建一个student.js,定义模型

,​​​​​​​        

 再另一个index.js文件引入即可

        

也可将student.js文件中的exports.model=stuModel;代码改为

        

从而再index中也可更改为

 ​​​​​​​        ​​​​​​​

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值