nodejs操作mongodb之三(關於schema的使用)

一、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);
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章