Think Tech About Rss

mongoDB 的一些总结

2023-05-26 Tech

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 使用 schema 定义

定义

const mongoose = require('./db');

const UserSchema = mongoose.Schema({
    name: String,
    age: Number,
    status: { // 默认参数
        type: Number,
        default: 1,
    }
})

module.exports=mongoose.model('User',UserSchema,'user');

使用

const UserModel = require('./model/user');

var user = new UserModel({
    name: '李四',
    age: 20
});
user.save((err) => {
    if (err) {
        console.log('保存数据错误')
    }
    console.log('保存数据成功');
});
[ { status: 1,
    _id: 5e0fdb9d6e124d1f3096d9f3,
    name: '张三',
    age: 20,
    __v: 0 },
  { status: 1, // 默认插入的是1
    _id: 5e0fdbca98ff701f9006afcd,
    name: '李四',
    age: 20,
    __v: 0 } ]

3 使用预定义模型修饰

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

  • lowercase
  • uppercase
  • trim

在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');

4 mogoose中预定义的set和get修饰符

定义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');

插入一条数据

const NewModel = require('./model/new');

const news = new NewModel({
    title: '文章一',
    author: '张三',
    avatar: 'xx.png'
})

news.save();

查询结果

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

5 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})

6 mongoose中的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');

7 时间的使用

定义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');

创建数据

const UserModel = require('./model/user');

const user = new UserModel({
  name: '王五',
  age: 20,
  mobile: 100,
  status: 0
});

user.save();

查询出创建后的数据

{
    "_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
}

修改createdAt和updatedAt显示

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');

创建出来的数据

{
    "_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
}

修改数据

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

修改后的数据

{
    "_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
}

插件的使用

搜索插件

https://plugins.mongoosejs.io/

自定义插件

// 定义一个插件
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);

Pre