一.Nosql:什么时候选择nosql
1.对数据库高并发读写的需求
2.对海量数据的高效率存储和访问的需求
3.对数据库的高可扩展性和高可用性的需求
二.对比
非结构型数据库。没有行、列的概念。用JSON来存储数据。集合就相当于“表”,文档就相当于“行”。
三.安装教程
1.https://www.runoob.com/mongodb/mongodb-window-install.html
win7建议下载4.0.1
2.配置环境变量
安装完成配置环境变量C:\Program Files\MongoDB\Server\3.0\bin 加入到系统的path环境变量中
3.测试
4.开启服务(不关闭窗口)
mongod --dbpath D:\Program Files\mongoData//新建专门存储数据的文件夹
四、常用语句
1.show dbs
1.use student
2.db.student.insert({“name”:”xiaom ing”});
3.show collections
4.db.dropDatabase();
5.db.user.drop ()
6.db.表名.insert({"name":"zhangsan"});
7.db.userInfo.find();相当于:select* from userInfo;
8.db.userInfo.distinct("name");
会过滤掉name中的相同数据相当于:select distict name from userInfo;
9.db.userInfo.find({"age": 22});相当于:select * from userInfo w here age = 22;
4、查询age > 22的记录
db.userInfo.find({age: {$gt: 22}});
相当于:select * from userInfo w here age >22;
5、查询age < 22的记录
db.userInfo.find({age: {$lt: 22}});
相当于:select * from userInfo w here age <22;
6、查询age >= 25的记录
db.userInfo.find({age: {$gte: 25}});
相当于:select * from userInfo w here age >= 25;
7、查询age <= 25的记录
db.userInfo.find({age: {$lte: 25}});
8、查询age >= 23 并且age <= 26注意书写格式
db.userInfo.find({age: {$gte: 23, $lte: 26}});
9、查询name中包含mongo的数据模糊查询用于搜索
db.userInfo.find({name: /mongo/});
//相当于%%select * from userInfo w here name like ‘%mongo%’;
10、查询name中以mongo开头的
db.userInfo.find({name: /^mongo/});
select * from userInfo where name like ‘mongo%’;
11、查询指定列name、age数据
db.userInfo.find({}, {name: 1, age: 1});
相当于:select name, age from userInfo;当然name也可以用true或false,当用ture的情况下河name:1效果一样,如果用false就是排除name,显示name以外的列信息。
12、查询指定列name、age数据, age > 25
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
相当于:select name, age from userInfo w here age >25;
13、按照年龄排序1升序-1降序
升序:db.userInfo.find().sort({age: 1});
降序:db.userInfo.find().sort({age: -1});
14、查询name = zhangsan, age = 22的数据db.userInfo.find({name: 'zhangsan', age: 22});
相当于:select * from userInfo w here name = ‘zhangsan’and age = ‘22’;
15、查询前5条数据db.userInfo.find().limit(5);
相当于:selecttop 5 *from userInfo;
16、查询10条以后的数据db.userInfo.find().skip(10);
相当于:select * from userInfo w here id not in (selecttop 10 * from userInfo);
17、查询在5-10之间的数据
db.userInfo.find().limit(10).skip(5);
可用于分页,limit是pageSize,skip是第几页*pageSize
18、or与查询
db.userInfo.find({$or: [{age: 22}, {age: 25}]});
相当于:select * from userInfo w here age = 22 or age = 25;
19、findOne查询第一条数据
db.userInfo.findOne();
相当于:selecttop 1 * from userInfo;db.userInfo.find().limit(1);
20、查询某个结果集的记录条数统计数量
db.userInfo.find({age: {$gte: 25}}).count();
相当于:select count(*) from userInfo w here age >= 20;
如果要返回限制之后的记录数量,要使用count(true)或者count(非0) db.users.find().skip(10).limit(5).count(true);
21.修改
1.db.student.update({"name":"小明"},{$set:{"age":16}});
2.db.student.update({"score.shuxue":70},{$set:{"age":33}})
3.db.student.update({"sex":"男"},{$set:{"age":33}},{multi: true})
4.完整替换,不出现$set关键字了:注意1db.student.update({"name":"小明"},{"name":"大明", "age":16});
db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);
相当于:update users set age = age + 50 where name = ‘Lisi’;
db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);
相当于:update users set age = age + 50, name = ‘hoho’w here name = ‘Lisi’;
22.删除
1.db.users.remove({age: 132})
2.db.users.remove({age: 132},{justone:true})
####五、索引、explain
1.创建索引:db.user.ensureIndex({"username":1})
2.获取当前集合的索引:db.user.getIndexes()
3.删除索引:db.user.dropIndex({"username":1})
4.复合索引(数字1表示username键的索引按升序存储,-1表示age键的索引按照降序方式存储):db.user.ensureIndex({"username":1, "age":-1})
5.唯一索引:db.user.ensureIndex({"userid":1},{"unique":true})
6.
image.png
7.查看查询的时间:db.tablename.find().explain( "executionStats")
六、nodejs中引用MongoDB
1.引入包:npm install mongodb --save-dev
var express = require("express");//数据库引用
var MongoClient = require('mongodb').MongoClient;
var app = express();
//数据库连接的地址,最后的斜杠表示数据库名字
var shujukuURL = 'mongodb://localhost:27017/news';
app.get("/",function(req,res){
//连接数据库,这是一个异步的操作
MongoClient.connect(shujukuURL, function(err, client) {
res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});
if(err){
res.send("数据库连接失败");
return;
}
res.write("恭喜,数据库已经成功连接\n");
//新的mongo不直接用db,返回的是client对象
let db = client.db('student');
db.collection("user").insertOne({"name":"哈哈"},function(err,result){
if(err){
res.send("数据库写入失败");
return;
}
res.write("恭喜,数据已经成功插入");
res.end();
//关闭数据库
db.close();
});
});
});
app.listen(8020);
七、MongoDB权限配置管理
1.
image.pngimage.png
2.常用的命令
1、show users; 查看当前库下的用户
2、db.dropUser("eggadmin") 删除用户
3、db.updateUser("admin",{pwd:"password"}); 修改用户密码
4、db.auth("admin","password"); 密码认证
3.Mongodb数据库角色
1.数据库用户角色:read、readWrite;
2.数据库管理角色:dbAdmin、dbOwner、userAdmin;
3.集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4.备份恢复角色:backup、restore;
5.所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6.超级用户角色:root
4.连接数据库的时候需要配置账户密码
consturl='mongodb://admin:123456@localhost:27017/';
八、数据库表之间的几种关系
1.一对一
2.一对多
3.多对多
九、聚合管道(表的关联、数据统计)
db.order.aggregate([
{
$project:{ trade_no:1, all_price:1 }
},
{
$match:{"all_price":{$gte:90}}
},
{
$group: {_id: "$order_id", total: {$sum: "$num"}}
},
{
$sort:{"all_price":-1}
},
{
$limit:1
},{
$skip:1
},{
$lookup:{
from: "order_item",
localField: "order_id",
foreignField: "order_id",
as: "items"
}
}
])
十、mongoose
一、特点
1、通过关系型数据库的思想来设计非关系型数据库
2、基于mongodb驱动,简化操作
二、安装和使用
1.安装
npm i mongoose --save
2.引入 mongoose 并连接数据库
const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test',{useNewUrlParser:true},function(){});
如果有账户密码需要采用下面的连接方式:
mongoose.connect('mongodb://eggadmin:123456@localhost:27017/eggcms');
3.定义 Schema
var UserSchema=mongoose.Schema({
name: String,
age:Number,
status:'number'
})
4.创建数据模型
var User=mongoose.model('User', UserSchema); //users
or
var User=mongoose.model('User', UserSchema,'user'); //user
5.查找数据
User.find({},function(err,docs){ if(err){
console.log(err); return;
}
console.log(docs);
})
6.增加数据
var u=new User({ //实例化模型 传入增加的数据
name:'lisi2222333', age:20,
status:true
})
u.save();
7.修改数据
User.updateOne({ name: 'lisi2222' }, { name: '哈哈哈' }, function(err, res) { if(err){
console.log(err); return;
}
console.log('成功')
});
8、删除数据
User.deleteOne({ _id: '5b72ada84e284f0acc8d318a' }, function (err) { if (err) {
console.log(err); return;
}
// deleted at most one tank document
console.log('成功');
});
三、默认参数&模块化
1.默认参数
var UserSchema=mongoose.Schema({
name: String,
age:Number,
status:{
type:number,
default:1
}
})
2.模块化
image.png image.png
3.性能
image.png
四、Mongoose预定义模式修饰符Getters与Setters自定义修饰符
1.预定义模式修饰符
lowercase、uppercase、trim
varUserSchema=mongoose.Schema({name:{type:String,trim:true}})
2.set&get
var NewsSchema = mongoose.Schema({
title:"string",
author:String,
pic:String,
redirect:{
type:String,
set(url){
if(!url) return url;
if(url.indexOf('http://')!=0&&url.indexOf('https://')!=0){
url='http://'+url;
}
return url;
},
get:function(url){
if(!url) returnurl;
if(url.indexOf('http://')!=0&&url.indexOf('https://')!=0){
url='http://'+url;
}
return url;
}
}
五、Mongoose索引、Mongoose内置CURD方法、扩展MongooseModel的静态方法和实例方法
1.索引
var DeviceSchema = new mongoose.Schema({
sn:{
type:Number,
//唯一索引
unique:true
},
name:{
type:String,
//普通索引
index:true
}
});
2.Mongoose内置CURD
image.png
3.方法
//静态方法
UserSchema.statics.findByUid = function(uid,cb){
this.find({"_id":uid},function(err,docs){
cb(err,docs)
})
}
//实例方法
UserSchema.methods.print = function(){
console.log('这是一个实例方法');
console.log(this);
};
module.exports=mongoose.model('User',UserSchema,'user')
扩展
//es5
function Person(){
this.run1=function(){
}
}
Person.name='哈哈哈';
Person.run2=function(){ 静态方法
}
var p=new Person();
Person.run2(); 静态方法的调用
p.run1(); 实例方法
//ts中
class Per{
public name:string;
public age:number=20;
//静态属性
static sex="男";
constructor(name:string) {
this.name=name;
}
run(){ /*实例方法*/
alert(`${this.name}在运动`)
}
work(){
alert(`${this.name}在工作`)
}
static print(){ /*静态方法 里面没法直接调用类里面的属性*/
alert('print方法'+Per.sex);
}
}
// var p=new Per('张三');
// p.run();
Per.print();
alert(Per.sex);
六、数据校验
1.校验参数
image.png
var UserSchema=newmongoose.Schema({
age:{
type:Number,
//是否必须的校验器
required:true,
//数字类型的最大值校验器
max:120,
//数字类型的最小值校验器
min:0
},
status:{
type:String,
//设置字符串的可选值
enum:['0','1','2']
},
phone:{
type:Number,
match:/^\d{11}$/
},
desc:{
type:String,
maxlength:20,
minlength:10,
//自定义的验证器,如果通过验证返回true,没有通过则返回false
validate:function(desc){
return desc.length>=10;
}
}
})
七、Mongoose中使用aggregate聚合管道
1.aggregate聚合管道
var mongoose = require('./db.js');
var OrderSchema = mongoose.Schema({
order_id:String,
uid:Number,
trade_no:String,
all_price:Number,
all_num:Number
})
var OrderModel = mongoose.model('Order',OrderSchema,'order');
OrderModel.aggregate([{
$lookup:{
from:'order_item',
localField:"order_id",
foreignField:"order_id",
as:"item"
}
}],function(err,docs){
console.log(docs)
});
image.png
2.多表关联查询
image.png
八、Mongoose中使用populate实现关联查询
1.versions>=3.2
image.png
2.实现
//model定义
image.png
//
image.png
image.png
网友评论