MongoDB 是为快速开发互联网Web应用而设计的数据库系统,官方地址 https://www.mongodb.com/
数据库(DataBase)是按照数据结构来组织、存储和管理数据的仓库。是一个应用程序.
数据库:用于存储数据。可以通过命令操作数据。
关系型数据库(结构型数据库) : sql server mysql
库
表
行 列
商品信息表 goodsId goodsName goodsPrice createTime用户信息表
非关系型数据库(非结构数据库):no sql mongodb 日志处理。
库userList
集合collection my
文档 document {userName:”张三"}
{age:12}
控制面板-》管理工具-》服务-》MongoDB server
右击停止服务;右击属性将服务禁用
打开控制台,输入mongo回车。
提示的内容如果是“不是内部命令”,需要配置环境变量。
我的电脑--》属性-》高级系统设置-》高级-》系统变量-》path
C:\Program Files\MongoDB\Server\4.2\bin
手动挂载数据库
mongo命令可以让我们进入到mongo的交互环境,在该环境当中可以通过命令操作数据库
1、创建一个文件夹mongo用于存放数据库文件。
2、执行命令: mongod --dbpath D:\mongo
3、将控制台最小化。(不要关闭控制台)
4、重新打开控制台,输入mongo命令。
其它命令
show dbs :显示当前的数据库列表
show collections :显示当前数据库的集合列表
use admin :进入到admin数据库
db :查看当前所在的数据库。
db.dropDatabase():删除当前的数据库
db.createCollection("userList") :创建一个名字为userList的集合
db.userList.drop(): 删除名字为userList的集合
db.scoreList.renameCollection("my"): 将当前数据库当中的scoreList集合更名为my
//在userlist集合中插入一条文档。 会检测是否存在对应的库与集合,如果不存在会自动 创建。
db.userlist.insert({a:1,b:2,userName:"zhangsan"})
// 插入多条数据
db.scorelist.insert([{userName:"李四"},{userName:"王五"}]
// 导入数据:* 不要在mongo命令下导入,退出mongo环境。
mongoimport --db tiechui --collection scoreList --file D:\210225\Lession21\code\data.txt --drop
// --db:指定数据库名
// --collection:指定集合名
// --file:指定导入的数据文件
// --drop:不是必填项。 省略该项,为追加。使用该项,会将之前的数据删除掉。
// 删除满足条件的所有文 档
db.scoreList.remove({sex:"男"})
// 删除满足条件的第一条记录
db.scoreList.remove({sex:"女"},{justOne:true})
// 删除所有记录
db.scoreList.remove({})
// 更新一个
db.collection.updateOne(查询条件,要更新的内容[,配置对象])
// 批量更新
db.collection.updateMany(查询条件,要更新的内容[,配置对象])
// 第一个参数是条件,第二个参数是修改内容。完整修改。
db.scoreList.update({userName:"李昂"},{sex:"男"})
// 条件年龄等于12,只修改名字为张三丰。只会修改第一个满足条件的文档
db.scoreList.update({age:12},{$set:{userName:"张三丰"}})
// 根据条件修改多条文档。加上{multi:true})才能多条
db.scoreList.update({age:12},{$set:{sex:"女"}},{multi:true})
// 当条件无法满足时,将upsert设置为true,可以增加一条记录
db.scoreList.update({age:1000},{userName:"王振",sex:"男"},{upsert:true})
// 满足条件的记录中的年龄加100
db.scoreList.update({userName:"张三丰"},{$inc:{age:100}})
// 根据条件查找一条记录
db.scoreList.findOne({age:12})
// 将当前数据库下的scoreList集合中的文档进行显示。
db.scoreList.find()
// 统计当前数据库scoreList集合的文档数量
db.scoreList.count()
// 查找名字为王五的记录
db.scoreList.find({userName:"王五"}))
// 查找年龄为12的所有记录
db.scoreList.find({age:12})
// 查找年龄为12且性别为女。多条件查找
db.scoreList.find({age:12,sex:"女"})
// 模糊搜索:查找名字当中包含孙
db.scoreList.find({userName:/孙/})
// 年龄大于12的所有文档记录
db.scoreList.find({age:{$gt:12}})
// 年龄小于45的所有文档记录
db.scoreList.find({age:{$lt:45}})
// 年龄不等于12的所有文档记录
db.scoreList.find({age:{$ne:12}})
// 年龄在数组当中的所有文档记录
db.scoreList.find({age:{$in:[45,22]}})
// 年龄大于12,小于等于45
db.scoreList.find({age:{$gt:12,$lte:45}})
/*
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$in 包含
$ne 不等于
*/
// 查找年龄为22或性别为男
db.scoreList.find({$or:[{age:22},{sex:"男"}]})
// 查找年龄等于12且性别为女
db.scoreList.find({$and:[{age:12},{sex:"女"}]})
db.scoreList.find({age:12,sex:"女"})
// 查找语文成绩为30 。*如果有特殊字符需要用双引号包裹。
db.scoreList.find({"score.yuwen":30})
// 排序:升序(正序):从小到大 降序(倒序):从大到小
// 按年龄的倒序
db.scoreList.find().sort({age:-1})
// 年龄的正序
db.scoreList.find().sort({age:1})
// 先按条件查找,将查找的结果进行正序。
db.scoreList.find({sex:"女"}).sort({age:1})
// 按照年龄的正序排列,如果年龄相同,则按照语文的倒序
db.scoreList.find().sort({age:1,"score.yuwen":-1})
// 获取scoreList集合当中的前3条.* 如果写0,则相当于没写
db.scoreList.find().limit(3)
// 跳过文档数量2及以后
db.scoreList.find().skip(2)
// find sort limit skip 是可以结合使用的。
// 先排序,再skip,然后limit
db.scoreList.find().skip(9).limit(3).sort({age:1})
// (当前页-1)*每页显示的文档条数 === skip
db.scoreList.find().skip(0).limit(3).sort({age:1}) // 第一页
db.scoreList.find().skip(3).limit(3).sort({age:1})// 第二页
db.scoreList.find().skip(6).limit(3).sort({age:1})// 第三页
db.scoreList.find().skip(9).limit(3).sort({age:1})// 第四页
// 查找年龄为12
db.scoreList.find({$where:function(){return this.age==12}})
// 指定文 档显示的内容为:userName,不包含_id
db.scoreList.find({age:12},{userName:true,_id:false})
Mongoose 是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装,并提供了更多的功能。 官网 http://www.mongoosejs.net/
使用代码操作 mongodb 数据库
// 1、下载
npm install mongoose
// 2、引入
const mongoose = require("mongoose");
// 3、连接数据库
三种方法
// 通过回调函数得到结果
const mongoose = require("mongoose");
// 连接,第一个参数是连接的地址
// mongodb://127.0.0.1:27017 地址
// zhang 数据库的名字
mongoose.connect("mongodb://127.0.0.1:27017/zhang",{
useNewUrlParser:true,// 使用最新的地址解析方式
useUnifiedTopology:true// 使用最新监听器
},function (err) {
if(err) {
console.log("连接数据库失败")
}else{
console.log("连接数据库成功")
}
})
// 通过Promise接收连接数据库的结果
const mongoose = require("mongoose");
const con = mongoose.connect("mongodb://127.0.0.1:27017/zhang",{
useNewUrlParser:true,// 使用最新的地址解析方式
useUnifiedTopology:true// 使用最新监听器
})
con.then(value=>{
console.log("数据库连接成功",value);
}).catch(reason => {
console.error("数据库连接失败",reason);
})
// 通过事件监听来完成连接数据库
const mongoose = require("mongoose");
mongoose.connect("mongodb://127.0.0.1:27017/zhang",{
useNewUrlParser:true,// 使用最新的地址解析方式
useUnifiedTopology:true// 使用最新监听器
})
mongoose.connection.on("open",function () {
console.log("连接数据库成功")
})
mongoose.connection.on("error",function () {
console.log("连接数据库失败")
})
文档结构可选的字段类型列表
数据库的基本操作包括四个,增加(create),删除(delete),修改(update),查(find)
① 创建一个约束对象Schema
const schema = new mongoose.Schema({
userName:{
type:String,// 类型是一个字符
unique:true,// 内容不允许重复
required:true// 不允许为空
},
age:{
type:Number,
default:18// 默认值
},
sex:{
type:String,
default:"男"
},
hobby:[Number],// 是一个数据,且数据元素的类型为数字
qita:mongoose.Schema.Types.Mixed// 没有限制
},{
versionKey:false //去掉_v
})
② 创建一个数据模型,通过该模型指定操作的集合,以及获得操作的数据的方法
第一个参数是操作的集合名字,第二个参数为约束对象
const model = mongoose.model("userList",schema);
③ 增加一条数据
result: 是插入集合中的数据。
_id: 唯一标识
userName,age是自己设置插入的内容
__v:versionKey 作用:为了解决获取与保存之间的冲突。
({
userName:"张三",
age:12
},function (err,result) {
if(err){
console.error("插入失败",err);
}else{
console.log("插入成功",result);
// { _id: 609e32eb54d23a3d180eaf42, userName: '张三', age: 12, __v: 0 }
}
})
result 是 Promise的实例
const result = model.create({
userName:"老王1"
})// result 是一个Promise实例
result.then(value=>{
console.log("成功插入",value)
}).catch(reason=>{
console.error("插入失败",reason)
})
console.log(result);
① 插入一条数据
model.create({
userName:"王五2",
qita:"其它",
},function (err,result) {
if(err){
console.error("插入失败",err);
}else{
console.log("插入成功",result);
}
})
② 插入多条数据
model.create([{
userName:"小刘"
},{
userName: "小兰"
}]).then(value=>{
console.log("成功",value);
}).catch(reason => {
console.error("失败",reason)
})
或者
model.insertMany([
{
userName: "大王1",
age:12,
},{
userName: "小王1",
sex:"女"
}
],function (err,result) {
if(err){
console.error(err);
}else{
console.log(result)
}
})
① 将scoreList当中的数据罗列出来
第一个参数是条件,{}:无条件
model.find({},function (err,result) {
// result 是一个数组,数组为符合条件的文 档
console.log(result);
})
② 将scoreList当中性别为女的记录进行显示
model.find({sex:"女"},function (err,result) {
console.log(result);
})
③ 搜索出来一条记录,根据ID进行搜索
model.findOne({_id:"609e38672f9e444624439954"},function (err,result) {
// result 是一个对象
console.log(result)
})
根据年龄搜索
model.findOne({age:18},function (err,result) {
// result 是一个对象
console.log(result)
})
④ findById:根据ID进行搜索 相当于 model.find({_id:“609e38672f9e444624439954”})
model.findById("609e38672f9e444624439954",function (err,result) {
console.log(result)
})
⑤ 获得满足条件的文档数量
model.countDocuments({sex:"女"},function (err,count) {
console.log(count)
})
⑥ skip limit sort
model.find().skip(1).limit(2).sort({age:1}).exec(function (err,result) {
if(err){
console.error(err);
}else{
console.log(result);
}
})
⑦ select 投影
model.find().select({userName:true,_id:false}).exec(function (err,result) {
console.log(result)
})
① 更新一条,第一个参数是条件,第二个参数是修改的内容
model.updateOne({age:18},{userName:"下课"},function (err,result) {
console.log(result);
})
model.updateOne({age:18},{$inc:{age:100}},function (err,result) {
console.log(result);
})
② 更新多条
model.updateMany({age:18},{sex:"女"},function (err,result) {
console.log(result);
})
① 删除一条
model.deleteOne({age:18},function (err,result) {
console.log(result);
})
② 删除多条
model.deleteMany({age:18},function (err,result) {
console.log(result);
})
mongoose要挂载起来
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-stlySjsn-1621943318623)(C:\Users\王秀\AppData\Roaming\Typora\typora-user-images\image-20210515151828681.png)]
一、启动 mongod 带验证选项
# mongod --auth
二、创建用户
> use admin
> db.createUser({user:"admin",pwd:"password",roles:["root"]})
三、连接 mongod 服务
> mongo
> use admin
> db.auth("admin", "password")
四、mongoose 连接操作
mongoose.connect('mongodb://admin:password@localhost/prepare?authSource=admin');
代表有:MySQL、Oracle、DB2、SQL Server…
.net c#
特点:关系紧密,都是表
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:通用,可用于复杂查询;
3、高级查询:可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、有固定的表结构,字段不可随意更改,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
代表有:MongoDB、Redis…
特点:关系不紧密,有文档,有键值对
优点:
1、格式灵活:存储数据的格式可以是key,value形式。
2、速度快:nosql可以内存作为载体,而关系型数据库只能使用硬盘;
3、易用:nosql数据库部署简单。
缺点:
1、不支持事务;
2、复杂查询时语句过于繁琐。
关系型数据库:
库-》表-》行列
创建表:指定字段的名字,指定类型,是否允许为空,指定长度。
字段 是否允许为空 类型 长度
userName false string 5
age false int 2
id
id userName age
1 zhangsan 12
*************************************************
非关系数据库
库-》集合-》文档
文档:{}
存储:storage 画布canvas
10.1 新建get.html 在get中输入
<script>
console.log(localStorage.userName);
console.log(localStorage.getItem("sex"));
console.log(localStorage["age"])
</script>
得到的结果是undefined,null, undefined
10.1 新建set.html 在get中输入
localStorage.userName = "zhangsan";
localStorage.setItem("age",16)
localStorage["sex"] = "男"
则在application中就会得到数据,且set.html中就会有值 为:张三,男,16
10.3 新建remove.html 输入
localStorage.clear();//将之前的数据都清空了
localStorage.removeItem("age") //只清空了年龄
合-》文档
文档:{}
## 10 storage canvas
存储:storage 画布canvas
10.1 新建get.html 在get中输入
```js
得到的结果是undefined,null, undefined
10.1 新建set.html 在get中输入
localStorage.userName = "zhangsan";
localStorage.setItem("age",16)
localStorage["sex"] = "男"
则在application中就会得到数据,且set.html中就会有值 为:张三,男,16
[外链图片转存中…(img-0kGNkR1f-1621943318630)]
10.3 新建remove.html 输入
localStorage.clear();//将之前的数据都清空了
localStorage.removeItem("age") //只清空了年龄