目录
一对多(one to many)/多对一(many to one)
下载及安装
官网下载地址: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内容如下:
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 --

后在资源管理器服务中启动
打开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中也可更改为