在node环境下使用Mongoose来操作MongoDB

一. 准备工作

在create-react-app 脚手架工具的src文件夹创建pages/Server/server.js做好前期准备工作。

image.png

二. 前置文件安装

yarn add mongoose ,yarn add express,yarn add nondemon

三. 理清概念

我们要知道要使用mongoDB数据库,你必须先启动mongoddb的服务,默认地址是localhost:27017,才可以操作数据库,在这里我们需要首先要分清楚和通过node express创建端口号的区别。

前端发起的请求如get,post等这些方法,你如果直接给localhost:27017发送,数据库是无法处理这些数据的,它身上不存在响应这些方法的api。不然要后端干什么,你前端直接都能和服务器交流了,后端就没什么存在的意义了。

那怎么办呢?数据获取不了我没办法下班啊,这时候就需要后端来当这个中间人。后端的语言正好可以用来识别前端发过来的请求,并且还可以访问数据库,这不正好当这个红娘吗?

server.js这个文件就是后端来编写代码的地方,来设置不同的端口号和请求方法来区分数据库里数据的类型。比如买汽车,汽车里面有轿车,跑车。那么后端就可以给轿车先区别一个端口号1000,给跑车一个端口号2000,然后再细分,用来方便快速的获取不同类型的数据。

localhost:2701727017仅仅是让后端来找到数据库的,你前端知道这个地址是没什么用处的(你暂时可以这样理解)因为你的js语言写出来的代码,数据库不认识。

四. 链接mongoDB

我们都知道mongoDB有可视化软件compass,任何可视化软件的流程都是底层代码来执行的,你首先要理清楚这一点。那么你就可以很轻松的掌握在编写代码的时候,我应该以什么顺序来完成前期的工作。

这里一进来就需要我们选择链接一个服务地址

image.png

那么对应的我们的代码第一步也是链接

image.png

链接好以后就是创建数据库

mongoose提供了三个最最重要的对象,Schema,Model,Document,这三个模块使用的先后顺序是必须先Schema,Model,Document的。Schema相当于约束你这个集合里必须有的值,不然整个数据库乱套了。

image.png

想用就得先引入,这里可以选择es6的结构赋值,也可以变量赋值。

首先要清楚,你的数据库里不可能只有一个集合,所以不同的集合的Schema也不同,这时候就需要单独设置,Schema就是一个构造函数

image.png

你定义的userInfoSchema就是实例化了它,变量名字可以随便定义,这不是最终的集合名称。
注意到这一步,你仅仅是规定了集合的文档里需要有什么内容,而不是创造了这个集合。下一步才是创造集合,我们需要使用第二个重要的对象Model

image.png

model方法接受两个参数,第一个是你集合的最终名字,第二个参数是集合的Schema。

在这里和直接在mongodDB shell里略微有些不同。你在shell里是直接根据集合名称来操作的如db.userInfo.insert({}),但是在mongoose里,他并不是直接使用集合来操作,而是使用你前面的那个变量名,通常我们可以把它直接设置为和集合相同的名字。

image.png

但是,这个时候因为userinfo这个集合里还没有文档,所以这个集合还并没有保存到服务上,所以我们需要创建一个文档对象,注意了,这里不是collection.insert()方法了,而是clooection.create(),使用方法和insert基本相同

image.png

在compass里可以看到已经成功插入.

image.png


五.model.find()的一些相关条件查询

image.png

image.png

上面这段话的意思是,
1.第一个参数:找到userName为admin1的用户列表

2.第二个参数:并且只显示userName属性,且不显示_id属性,(需要知道的是,mongodb默认会返回_id

3.第三个参数:跳过第一个,并且只显示一个 条件结果。

4.第四个参数:一个函数,该函数必须填写,第一个结果是err,如果查询失败,会把失败的结果返回给第一个参数,如果成功会把我们查询的结果返回给第二个参数。
为什么该函数必须填写呢?因为我们的业务逻辑就是在这个回调函数的第二个参数里执行的,你光找到数据了,没处理,那么你调用find有什么意义呢?

注意find()是返回的是数组,需要加索引来获取内容,docs[1].xxx.
findOne直接就是一个对象。可以直接用docs.xxx获取相对应的属性。

六.document的一些增删改方法

1.1增

上面通过model可以进行对文档,也就是数据的一些添加,我们还可以直接通过对文档的操作来进行数据的添加。因为model也是一个构造函数,那么我们就可以直接在model身上实例化。

image.png

这时候你去查看数据库,发现它并没有被添加到 userInfo这个集合里

image.png

这是因为你只是在代码的世界里创建出了一个变量user_2,如果想保存进model内,就需要调用user_2.save()方法

image.png

image.png

即可看到插入了一条新数据。

1.2改

你既然都已经拿到user_2这个实际的数据了,那update也太so easily了。

你可以通过两种方法来实现。

1.user_2.update({$set:{userName:"admin3"}});或者更加简单直接,提个醒,user_2是你实例化的一个对象,还想不起来吗?

2我反手直接修改这个对象的属性不就好了吗?.user_2.userName="admin4"但是注意,你这一步只是修改了代码世界里的变量,别忘了执行user_2.save()

1.3删

user_2.remove()还是那句话,不建议直接删除数据,而是给需要删除的数据一个额外的属性,例如user_2.isdelete=true以后来通过find()方法筛选掉这些isdelete为true的就可以了。(这里要注意,你的Schema里如果没有这个属性,你是无法加入这个属性的)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值