学习MongoDB的使用
在命令行中的基本命令
mongo -port 27017
默认登录方式
mongo:\\admin:123456@127.0.0.1:27017
验证登录show dbs
查看当前全部数据库use db
切换到当前数据库, 没有会自动创建
//查找大于10的数据
db.user.find({
age: {$gt: 10}
})
//查找在24到30之间的数据
db.user.find({
age: {$gte: 24, $lte: 30}
})
mongodb
查询
$gt
大于$lt
小于$gte
大于等于$lte
小于等于/ /
模糊查询/^ /
以–开头({}, {name: 1})
只查询集合中的一个limit
限制查询条skip
跳过{$or: [{"age": 20},{"age": 29}]}
|| 或{"age": 20, "name": "zhangsan"}
&& 并count
个数,类似于聚集函数explain("executionStats")
查询时间
删除
- 删除表
db.user.drop()
- 删除数据库
db.dropDatabase()
- 删除数据
db.user.remove({name: "张麻子"})
修改
db.user.update({"age": 20}, {$set: {"age": 23, "name": "张麻子"}})
有$set就是修改指定的值, 没有就是后面的覆盖前面的
索引
- 创建索引
db.user.ensureIndex({"username": 1})
- 获取当前索引
db.user.getIndexes()
- 删除索引
db.user.dropIndex({"username":1})
- 复合索引
db.user.ensureIndex({"title": 1,"price":-1})
- 唯一索引,值唯一
db.user.ensureIndex({"name": 1}, {unique: true})
使其查询时间更快
验证登录,用户权限
// 1. 现在admin数据库中创建一个用户管理权限的用户
use admin
db.createUser(
{
user: 'admin',
pwd: '123456',
roles: [role: 'userAdminAnyDataBase', db: 'admin'] //权限,指定数据库
}
)
// 2. 开启验证
//MongoDB 4.0之后的版本开启验证需要在mongod.cfg里面的开启验证
security:
authorization: enabled
// 3. 登录认证
//直接登录`mongo`但是发现大部分操作命令会报错, 这时候切换到admin数据库`use admin`//使用`db.auth("admin", "123456")`进行验证
// 4. 创建用户来对其中数据库进行读写
use project
db.createUser(
{
user: 'user1',
pwd: '123456',
roles: [role: 'readWrite', db: 'project']
}
)
// 在退出, 直接在登录的时候使用创建的用户名和密码进行登录就行
Read
:允许用户读取指定数据库readWrite
:允许用户读写指定数据库dbAdmin
:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin
:允许用户向system.users
集合写入,可以找指定数据库里创建、删除和管理用户clusterAdmin
:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。readAnyDatabase
:只在admin数据库中可用,赋予用户所有数据库的读权限readWriteAnyDatabase
:只在admin数据库中可用,赋予用户所有数据库的读写权限userAdminAnyDatabase
:只在admin数据库中可用,赋予用户所有数据库的userAdmin
权限dbAdminAnyDatabase
:只在admin数据库中可用,赋予用户所有数据库的dbAdmin
权限。root
:只在admin数据库中可用。超级账号,超级权限。
在NodeJs
中使用mongoose
- 引入
require('mongoose')
- 连接
mongoose.connect('mongodb://localhost:27017/test')
有密码的话
mongoose.connect('mongodb://admin@qq.com:123456@localhost:27017/test')
- 创建Schema,对于数据库里的collection, 但是不能操作数据
- 创建model模型, 操作数据库
- 增加数据, new一个模型.save()
const u = new User({
username: 'xsx',
password: 'sxsx'
})
u.save()
- 修改
update({},{})
使用mongoose进行建模和关联
-
模型的关联, 分类和文章之间是多对多的关系
categories: [{type: mongoose.SchemaTypes.ObjectId, ref: 'Category'}]
将这个文章里面的categories的值类型为mongodb里面模型的id类型, 绑定分类这个模型
-
找到文章和分类的值, 将分类里面的id值传给文章里面的categories, 并且保存. 这样再去查找文章的时候, 就包含了分类的值
a1.categories = [ type1._id, type2._id ] await a1.save() const articles = await Article.find().populate('category')
其中
populate()
就可以根据关联的值找到关联的模型里集合的值,这样查找出来的文章就有分类的值了 -
再就是从分类下查找文章, 意思是这个分类下有哪些文章。也就是一对多, 给Category的模型设置虚拟字段来关联Article
CategorySchema.virtual('as', { localField: '_id', ref: 'Article', foreignField: 'category' })
- as是设置虚拟字段的字, 而localField则是本身模型要关联的值, ref是关联哪一个模型, foreignField则是模型下哪一个值被关联
这样直接就可以查找Category的值, 里面就包含了有虚拟字段的文章的值
- 用
await Category.find().populate('as').lean()
找到。其中lean是关键 - 也可以使用JSON.stringify()转化为字符串打印出来, 但是需要先加上
const categorySchema = new mongoose.Schema({ name: { type: String } }, // 使用Json就会出现虚拟字段了 { toJSON: {virtuals: true} })
预定义和自定义修饰符
对增加的数据进行格式化
default
默认值, 当值允许为空的时候trim
去掉空格set
自定义title: { set(v) {return v+1} }
index: true
普通索引unique: true
唯一索引select
是否被投影
添加静态和实例方法
statics
和 methods
在Schema
ArticleSchema.statics.findBytitle = async function(obj, callback) {
await Article.find({
title: obj.title
}, function(err, doc) {
callback(err, doc)
})
}
ArticleSchema.methods.findBybody = async function(obj, callback) {
console.log(obj.body)
await Article.find({
body: obj.body
}, function(err, doc) {
callback(err, doc)
})
}
数据校验
require
: 表示值必须传入max、min
数据的最大值和最小值enum
枚举满足一个数组内的值,值得类型为字符串match
满足正则表达式maxlength
、minlength
字符串长度的最大和最小值validate
类似于set
添加时间戳
const ArticleSchema = new mongoose.Schema({
title: { type: String },
body: { type: String },
categories: [{type: mongoose.SchemaTypes.ObjectId, ref: 'Category'}]
}, {
timestamps: true //返回时间戳
})
aggregate 聚合管道
-
聚合表达式一些常见的操作
-
聚合管道, 都是对文档进行操作
//加上$lookup,关联查询 db.order.aggregate([ { $look: { form: 'order_item', localField: 'order_id', foreignField: 'order_id', as: 'items' } } ])
导出和导入数据库
-
mongodump -h dbhost -d dbname -o dbdirectory
dbhost
为地址,dbname
为数据库名,dbdirectory
为路径 -
mongorestore -h dbhost -d dbname path
path为哪里的数据库备份
- 推荐先学习MongoDB官网的的文档,再学习mongoose就很简单了 `