学习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}) 使其查询时间更快
验证登录,用户权限
use admin
db
.createUser(
{
user
: 'admin',
pwd
: '123456',
roles
: [role
: 'userAdminAnyDataBase', db
: 'admin']
}
)
security
:
authorization
: enabled
use project
db
.createUser(
{
user
: 'user1',
pwd
: '123456',
roles
: [role
: 'readWrite', db
: 'project']
}
)
Read:允许用户读取指定数据库readWrite:允许用户读写指定数据库dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profileuserAdmin:允许用户向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 聚合管道
聚合表达式一些常见的操作
聚合管道, 都是对文档进行操作
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就很简单了 `