nodejs操作mongodb之三(关于schema的使用)

445 阅读4分钟

一、schema默认参数

很多时候我们会设置默认参数,不插入数据的时候就默认这个值

  • 1、封装好的连接数据库模块

    // 第一步
    const mongoose = require('mongoose');
    
    // 第二步连接数据库
    mongoose.connect('mongodb://root:123456@localhost/nest_cms', { useNewUrlParser: true }, (err) => {
        if (err) {
            console.log('连接错误');
            return;
        }
        console.log('mongodb连接成功');
    });
    
    module.exports = mongoose;
    
  • 2、定义user模型

    const mongoose = require('./db');
    
    const UserSchema = mongoose.Schema({
        name: String,
        age: Number,
        status: { // 默认参数
            type: Number,
            default: 1,
        }
    })
    
    module.exports=mongoose.model('User',UserSchema,'user');
    
  • 3、使用定义好的模型

    const UserModel = require('./model/user');
    
    var user = new UserModel({
        name: '李四',
        age: 20
    });
    user.save((err) => {
        if (err) {
            console.log('保存数据错误')
        }
        console.log('保存数据成功');
    });
    
  • 4、查询数据返回的

    [ { status: 1,
        _id: 5e0fdb9d6e124d1f3096d9f3,
        name: '张三',
        age: 20,
        __v: 0 },
      { status: 1, // 默认插入的是1
        _id: 5e0fdbca98ff701f9006afcd,
        name: '李四',
        age: 20,
        __v: 0 } ]
    

二、mongoose预定义模式装饰符

  • 1、mongoose中内置的预定义修饰符主要有

    • lowercase
    • uppercase
    • trim
  • 2、在schema中使用

    const mongoose = require('./db');
    
    const UserSchema = mongoose.Schema({
        name: {
            type: String,
            trim: true,
        },
        age: Number,
        message1: {
            type: String,
            lowercase: true,
        },
        message2: {
            type: String,
            uppercase: true,
        },
        status: {
            type: Number,
            default: 1,
        }
    })
    
    module.exports=mongoose.model('User',UserSchema,'user');
    

三、mogoose中预定义的setget修饰符

我们还可以通过 set(建议使用) 修饰符在增加数据的时候对数据进行格式化。也可以通过get(不建议使用)在实例获取数据的时候对数据进行格式化,并不是在查询数据的时候数据格式化。

  • 1、定义schema

    const mongoose = require('./db');
    
    const NewSchema = mongoose.Schema({
        title: {
            type: String,
            trim: true,
        },
        author: String,
        avatar: {
            type: String,
            set(url) {
                if (!url) {
                    return '';
                }
                if (url.indexOf('http://') !=0 && url.indexOf('https://') !=0) {
                    url = 'http://' + url;
                }
                return url;
            }
        }
    })
    
    module.exports = mongoose.model('New', NewSchema, 'new');
    
  • 2、插入一条数据

    const NewModel = require('./model/new');
    
    const news = new NewModel({
        title: '文章一',
        author: '张三',
        avatar: 'xx.png'
    })
    
    news.save();
    
  • 3、查询结果

    {
        "_id" : ObjectId("5e0fe0b971428227107241c1"),
        "title" : "文章一",
        "author" : "张三",
        "avatar" : "http://xx.png",
        "__v" : 0
    }
    

四、mongodb中的索引

  • 1、索引的作用

    索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得 更快。MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查 询优化技巧。

  • 2、创建索引

    db.user.ensureIndex({字段:1}) // 普通索引
    
  • 3、获取索引

    db.user.getIndexes()
    
  • 4、删除索引

    db.user.dropIndex({字段:1})
    
  • 5、复合索引

    // 数字 1 表示 username 键的索引按升序存储,-1 表示 age 键的索引按照降序方式存储
    db.user.ensureIndex({"username":1, "age":-1})
    
  • 6、唯一索引

    db.user.ensureIndex({"userid":1},{"unique":true})
    

五、mongoose中的schema创建索引

  • 1、定义schema的时候定义唯一索引

    const mongoose = require('./db');
    
    const UserSchema = mongoose.Schema({
        name: {
            type: String,
            trim: true,
            unique: true, // 创建唯一索引
        },
        age: Number,
        message1: {
            type: String,
            lowercase: true,
        },
        message2: {
            type: String,
            uppercase: true,
        },
        status: {
            type: Number,
            default: 1,
        }
    })
    
    module.exports=mongoose.model('User',UserSchema,'user');
    

六、时间的使用

  • 1、定义schema中使用timestamps属性

    var mongoose = require('./db.js');
    
    var UserSchema = new mongoose.Schema({
      name: String,
      age: Number,
      mobile: Number,
      status: {
        type: Number,
        default: 1
      }
    }, {
      //设置时间戳
      timestamps: true
    });
    
    module.exports = mongoose.model('User', UserSchema, 'user');
    
  • 2、创建数据

    const UserModel = require('./model/user');
    
    const user = new UserModel({
      name: '王五',
      age: 20,
      mobile: 100,
      status: 0
    });
    
    user.save();
    
  • 3、查询出创建后的数据

    {
        "_id" : ObjectId("5e12a7f6c63086a54eed0a47"),
        "status" : 0,
        "name" : "王五",
        "age" : 20,
        "mobile" : 100,
        "createdAt" : ISODate("2020-01-06T03:22:30.336Z"), // 与系统默认时间相差8小时
        "updatedAt" : ISODate("2020-01-06T03:22:30.336Z"),
        "__v" : 0
    }
    
  • 4、修改createdAtupdatedAt显示

    var mongoose = require('./db.js');
    
    
    var UserSchema = new mongoose.Schema({
      name: String,
      age: Number,
      mobile: Number,
      status: {
        type: Number,
        default: 1
      }
    }, {
      //设置时间戳
      timestamps: {
        createdAt: 'created_at',
        updatedAt: "updated_at"
      }
    });
    
    module.exports = mongoose.model('User', UserSchema, 'user');
    
  • 5、创建出来的数据

    {
        "_id" : ObjectId("5e12ac19a1b9cfab59fbd913"),
        "status" : 0,
        "name" : "马六",
        "age" : 20,
        "mobile" : 100,
        "created_at" : ISODate("2020-01-06T03:40:09.560Z"),
        "updated_at" : ISODate("2020-01-06T03:40:09.560Z"),
        "__v" : 0
    }
    
  • 6、修改数据

    UserModel.updateOne({ _id: '5e12ac19a1b9cfab59fbd913' }, { name: '王小二' }, (err, docs) => {
      if (err) {
        console.log('修改数据错误', err);
        return;
      }
      console.log(docs)
    })
    
  • 7、修改后的数据

    {
        "_id" : ObjectId("5e12ac19a1b9cfab59fbd913"),
        "status" : 0,
        "name" : "王小二",
        "age" : 20,
        "mobile" : 100,
        "created_at" : ISODate("2020-01-06T03:40:09.560Z"),
        "updated_at" : ISODate("2020-01-06T03:42:51.022Z"),
        "__v" : 0
    }
    

七、插件的使用

  • 1、插件搜索地址

  • 2、自定义插件

    // 定义一个插件
    const lastModified = (schema, option) => {
      schema.add({ updated_at: Date });
      schema.pre('updateOne', (next) => {
        this.updated_at = moment(new Date()).format('YYYY-MM-DD HH:mm:ss');
        next();
      })
    }
    
    // 使用插入
    UserSchema.plugin(lastModified);