对于MongoDB的学习记录

    技术2026-01-05  9

    学习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.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 聚合管道

    聚合表达式一些常见的操作

    聚合管道, 都是对文档进行操作

    //加上$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就很简单了 `
    Processed: 0.014, SQL: 9