在create-react-app 脚手架工具的src文件夹创建pages/Server/server.js做好前期准备工作。
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:27017
27017仅仅是让后端来找到数据库的,你前端知道这个地址是没什么用处的(你暂时可以这样理解)因为你的js语言写出来的代码,数据库不认识。
我们都知道mongoDB有可视化软件compass,任何可视化软件的流程都是底层代码来执行的,你首先要理清楚这一点。那么你就可以很轻松的掌握在编写代码的时候,我应该以什么顺序来完成前期的工作。
这里一进来就需要我们选择链接一个服务地址
那么对应的我们的代码第一步也是链接
链接好以后就是创建数据库
mongoose提供了三个最最重要的对象,Schema,Model,Document
,这三个模块使用的先后顺序是必须先Schema,Model,Document
的。Schema相当于约束你这个集合里必须有的值,不然整个数据库乱套了。
想用就得先引入,这里可以选择es6的结构赋值,也可以变量赋值。
首先要清楚,你的数据库里不可能只有一个集合,所以不同的集合的Schema也不同,这时候就需要单独设置,Schema就是一个构造函数
你定义的userInfoSchema就是实例化了它,变量名字可以随便定义,这不是最终的集合名称。
注意到这一步,你仅仅是规定了集合的文档里需要有什么内容,而不是创造了这个集合。下一步才是创造集合,我们需要使用第二个重要的对象Model
model
方法接受两个参数,第一个是你集合的最终名字,第二个参数是集合的Schema。
在这里和直接在mongodDB shell里略微有些不同。你在shell里是直接根据集合名称来操作的如db.userInfo.insert({})
,但是在mongoose里,他并不是直接使用集合来操作,而是使用你前面的那个变量名,通常我们可以把它直接设置为和集合相同的名字。
但是,这个时候因为userinfo这个集合里还没有文档,所以这个集合还并没有保存到服务上,所以我们需要创建一个文档对象,注意了,这里不是collection.insert()方法了,而是clooection.create(),使用方法和insert基本相同
在compass里可以看到已经成功插入.
上面这段话的意思是,
1.第一个参数:找到userName为admin1
的用户列表
2.第二个参数:并且只显示userName
属性,且不显示_id
属性,(需要知道的是,mongodb默认会返回_id
)
3.第三个参数:跳过第一个,并且只显示一个 条件结果。
4.第四个参数:一个函数,该函数必须填写,第一个结果是err,如果查询失败,会把失败的结果返回给第一个参数,如果成功会把我们查询的结果返回给第二个参数。
为什么该函数必须填写呢?因为我们的业务逻辑就是在这个回调函数的第二个参数里执行的,你光找到数据了,没处理,那么你调用find有什么意义呢?
注意find()
是返回的是数组,需要加索引来获取内容,docs[1].xxx.findOne
直接就是一个对象。可以直接用docs.xxx获取相对应的属性。
上面通过model可以进行对文档,也就是数据的一些添加,我们还可以直接通过对文档的操作来进行数据的添加。因为model也是一个构造函数,那么我们就可以直接在model身上实例化。
这时候你去查看数据库,发现它并没有被添加到 userInfo这个集合里
这是因为你只是在代码的世界里创建出了一个变量user_2,如果想保存进model内,就需要调用user_2.save()
方法
即可看到插入了一条新数据。
你既然都已经拿到user_2这个实际的数据了,那update
也太so easily了。
你可以通过两种方法来实现。
1.user_2.update({$set:{userName:"admin3"}});
或者更加简单直接,提个醒,user_2
是你实例化的一个对象,还想不起来吗?
2我反手直接修改这个对象的属性不就好了吗?.user_2.userName="admin4"
但是注意,你这一步只是修改了代码世界里的变量,别忘了执行user_2.save()
user_2.remove()
还是那句话,不建议直接删除数据,而是给需要删除的数据一个额外的属性,例如user_2.isdelete=true
以后来通过find()方法筛选掉这些isdelete
为true的就可以了。(这里要注意,你的Schema里如果没有这个属性,你是无法加入这个属性的)