三| mongoose代码操作mongoDB

66 阅读3分钟

1.安装

npm i mongoos

2.使用

新建mongodb.js文件

// mongodb.js
// 导入
const mongoose = require('mongoose'); 


// 连接
// mongodb:协议名称
// mongodb:ip地址
// mongodb:默认端口号
// mongodb:数据库名称
mongoose.connect('mongodb://127.0.0.1:27017/test')

// 设置回调
// 成功
mongoose.connection.once('open', () => {})
// 失败
mongoose.connection.on('error', () => {})
// 关闭
mongoose.connection.on('error', () => {})

// 运行:终端输入
node mongodb.js

3.关闭

mongoose.disconnect()

4.常见文档操作方法(写在成功回调中)

mongoose.connection.once('open', () => {
    // 配置集合结构(Schema:约束属性以及属性值的类型)
    let books = new mongoose.Schema({
        name: {
            type: String,
            default: '西游',
            required: true,
            unique: true  // 必须独一无二的索引(比如手机号)
        },
        price: Number,
        author: String,
        is_hot: Boolean,
        tags: Array,
        style: {
            type: String,
            enum: ['言情', '玄幻'] // 枚举,输入内容必须在给定的范围内
        },
        date: Date,
        any: mongoose.Schema.Types.Mixed, // 任意类型
        id: mongoose.Schema.Types.ObjectId // 必须是文档ID(外键)
    })

    // 创建集合模型对象 ,也就是可以集合内的文档进行增删改查 (集合名称,结构对象)
    let booksModel = mongoose.model('book', books)

    // 创建文档
    booksModel.create({
        name: '西游记',
        style: '玄幻',
        author: '吴承恩',
        price: '20',
        is_hot: true,
        tags: ['神话', '名著'],
        date: new Date(),
        any: 232
    }).then((data) => {
        console.log(data);
    }).catch((err) => {
        console.log(err, 'err');
    })

    // 删除一条文档
    booksModel.deleteOne({ _id: '650297a15ee0fb6fe263fac5' }).then(res => {
        console.log(res)
    })

    // 批量删除文档
    booksModel.deleteMany({ is_hot: true }).then(res => {
        console.log(res)
    })

    // 更新单条文档,(条件,更新内容)
    booksModel.updateOne({ name: '西游记' }, { price: 1 }).then(res => {
        console.log(res, '更新成功')
    })

    // 批量更新文档
    booksModel.updateMany({ name: '西游记' }, { price: 11 }).then(res => {
        console.log(res, '更新成功')
    })

    // 读取单条文档(条件)
    booksModel.findOne({ name: '西游记' }).then(res => {
        console.log(res, '读取')
    })

    // 根据ID读取文档
    booksModel.findById('6502a239e6606c73c4299354').then(res => {
        console.log(res, '根据ID读取')
    })

    // 批量获取
    // 条件判断($lt less-than  小于 )
    // 条件判断($gt less-than  大于 )
    // 条件判断($ne less-than  不等于 )
    // 条件判断($lte less-than  小于或等于 )
    // 条件判断($gte less-than  大于或等于 )
    booksModel.find({ price: { $lt: 20 } }).then(res => {
        console.log(res, '批量获取')
    })

    //  或
    booksModel.find({ $or: [{ name: '西游记' }, { name: '西游记' }] }).then(res => {
        console.log(res, '批量获取')
    })

    // 且
    booksModel.find({ $and: [{ price: { $gt: 2 } }, { price: { $lt: 100 } }] }).then(res => {
        console.log(res, '批量获取')
    })

    // 正则关键字搜索文档
    booksModel.find({ name: new RegExp('西') }).then(res => {
        console.log(res, '批量获取')
    })

    // 读取指定文档
    booksModel.find().select({ name: 1, price: 1 }).then(res => {
        console.log(res, '读取指定对象')
    })

    // 数据排序(sort:1 升序,-1降序),可以和find.select
    booksModel.find().select({ name: 1, price: 1 }).sort({ price: 1 }).then(res => {
        console.log(res, '读取指定对象')
    })

    // 通过截取来筛选文档,一般用于分页(skip:数据从那一条跳过 .limit:数据截取的数量)
    booksModel.find().skip(1).limit(2).then(res => {
        console.log(res, '读取指定对象')
    })
})

5.封装

封装配置文件

创建:config.js文件

// 配置文件
module.exports = {
    host: '127.0.0.1', // ip地址
    port: '27017', // 端口号
    name: 'test', // 数据库名称
}

封装mongoose

创建:mongoose.js文件

// 通过module.exports对外暴露方法 (成功,失败)
module.exports = function (success, error = null) {
    // 导入mongoose
    const mongoose = require('mongoose');

    // 连接数据库 
    mongoose.connect(`mongodb://${host}:${port}/${name}`)

    // 成功回调
    mongoose.connection.once('open', () => {
        success()
    })

    // 失败回调
    mongoose.connection.on('error', () => {
        error()
    })

    // 关闭回调
    mongoose.connection.on('close', () => {
        console.log('close')
    })
}

封装管理文档

创建:document.js文件

// 管理文档
// 引入mongoose
const mongoose = require('mongoose');

// 配置集合
let books = new mongoose.Schema({
    name: {
        type: String,
        default: '西游',
        required: true,
        unique: true  // 必须独一无二的索引(比如手机号)
    },
    price: Number,
    author: String,
    is_hot: Boolean,
    tags: Array,
    style: {
        type: String,
        enum: ['言情', '玄幻'] // 枚举,输入内容必须在给定的范围内
    },
    date: Date,
    any: mongoose.Schema.Types.Mixed, // 任意类型
    id: mongoose.Schema.Types.ObjectId // 必须是文档ID(外键)
})

// 创建文档
let document = mongoose.model('book', books)

// 暴露
module.exports = document

使用封装的mongoose和文档方法

创建:db.js文件

const db = require('./mongoose') // 引入 mongoose.js 
const document = require('./document'); // 引入 文档操作方法


// 调用函数:使文档操作方法运行在mongoose中,db(成功,失败)
db(() => {
    // 测试读取文档
    document.find().select({ name: 1, price: 1 }).then(res => {
        console.log(res, '读取指定对象')
    })
})

终端运行

node mongodb.js