对于MongoDB的学习记录

2 篇文章 0 订阅
1 篇文章 0 订阅

学习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

  1. 引入 require('mongoose')
  2. 连接 mongoose.connect('mongodb://localhost:27017/test')
    有密码的话
    mongoose.connect('mongodb://admin@qq.com:123456@localhost:27017/test')
  3. 创建Schema,对于数据库里的collection, 但是不能操作数据
  4. 创建model模型, 操作数据库
  5. 增加数据, new一个模型.save()
  const u = new User({
    username: 'xsx',
    password: 'sxsx'
  }) 
  u.save()
  1. 修改 update({},{})

使用mongoose进行建模和关联

  1. 模型的关联, 分类和文章之间是多对多的关系

    categories: [{type: mongoose.SchemaTypes.ObjectId, ref: 'Category'}]
    

    将这个文章里面的categories的值类型为mongodb里面模型的id类型, 绑定分类这个模型

  2. 找到文章和分类的值, 将分类里面的id值传给文章里面的categories, 并且保存. 这样再去查找文章的时候, 就包含了分类的值

    a1.categories = [ type1._id, type2._id ]
    await a1.save()
    const articles = await Article.find().populate('category')
    
    

    其中populate()就可以根据关联的值找到关联的模型里集合的值,这样查找出来的文章就有分类的值了

  3. 再就是从分类下查找文章, 意思是这个分类下有哪些文章。也就是一对多, 给Category的模型设置虚拟字段来关联Article

    CategorySchema.virtual('as', {
      localField: '_id',
      ref: 'Article',
      foreignField: 'category'
    })
    
  • as是设置虚拟字段的字, 而localField则是本身模型要关联的值, ref是关联哪一个模型, foreignField则是模型下哪一个值被关联
    这样直接就可以查找Category的值, 里面就包含了有虚拟字段的文章的值
  1. await Category.find().populate('as').lean()找到。其中lean是关键
  2. 也可以使用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 是否被投影
添加静态和实例方法

staticsmethodsSchema

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 满足正则表达式
  • maxlengthminlength 字符串长度的最大和最小值
  • 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就很简单了 `
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值