Node.js开发-MongoDB

MongoDB

1) Mongoose

介绍

Mongoose 是一个对象文档模型库,官网 http://www.mongoosejs.net/

作用

方便使用代码操作 mongodb 数据库

使用流程

js 复制代码
// 导入mongoose
const mongoose = require("mongoose");

// 连接 mongodb
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');

// 设置回调
mongoose.connection.on("open", () => {
    // 设置连接成功的回调
    console.log("连接成功");
});
mongoose.connection.on("error", () => {
    // 设置连接错误的回调
    console.log("连接失败");
});
mongoose.connection.on("close", () => {
    // 设置连接关闭的回调
    console.log("连接关闭");
});

// 关闭连接
setTimeout(() => {
    mongoose.disconnect();
}, 2000);

2) 插入文档

js 复制代码
// 导入mongoose
const mongoose = require("mongoose");

mongoose.set('strictQuery', false);

// 连接 mongodb
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');

// 设置回调
mongoose.connection.once("open", () => {
    // 创建文档的结构对象
    let BookSchema = new mongoose.Schema({
        name: String,
        author: String,
        price: Number
    });

    // 创建模型对象
    let BookModel = mongoose.model('books', BookSchema);

    // 新增
    BookModel.create({
        name: "西游记",
        author: "吴承恩",
        price: 19.9
    }, (err,data)=>{
        if (err) {
            console.log(err);
            return;
        }
        console.log(data);
        
        mongoose.disconnect();
    });
});
mongoose.connection.on("error", () => {
    // 设置连接错误的回调
    console.log("连接失败");
});
mongoose.connection.on("close", () => {
    // 设置连接关闭的回调
    console.log("连接关闭");
});

3) 字段类型

文档结构可选的常用字段类型列表

类型 描述
String 字符串
Number 数字
Boolean 布尔值
Array 数组,也可以使用[]来标识
Date 日期
Buffer Buffer 对象
Mixed 任意类型,需要使用 mongoose.Schema.Types.Mixed 指定
ObjectId 对象 ID,需要使用 mongoose.Schema.Types.ObjectId 指定
Decimal128 高精度数字,需要使用 mongoose.Schema.Types.Decimal128 指定

4) 字段值验证

Mongoose 有一些内建验证器,可以对字段值进行验证

必填项

js 复制代码
title: {
    type: String,
    required: true // 设置必填项
},

默认值

js 复制代码
author: {
    type: String,
    default: '匿名' //默认值
},

枚举值

js 复制代码
gender: {
    type: String,
    enum: ['男','女'] //设置的值必须是数组中的
},

唯一值 (主键)

js 复制代码
username: {
    type: String,
    unique: true
},

unique 需要 重建集合 才能有效果

5) CRUD

数据库的基本操作包括四个,增加(create),删除(delete),修改(update),查(read)

1) 增加

插入一条

js 复制代码
SongModel.create({
    title:'给我一首歌的时间',
    author: 'Jay'
}, function(err, data){
    //错误
    console.log(err);
    //插入后的数据对象
    console.log(data);
});

批量插入

js 复制代码
PhoneModel.insertMany([
    {
        brand:'华为',
        color:'灰色',
        price:2399,
        tags:['电量大','屏幕大','信号好']
    },
    {
        brand:'小米',
        color:'白色',
        price:2099,
        tags:['电量大','屏幕大','信号好']
    }],(err,data)=>{
        if(err) throw err;
        console.log('写入成功');
        mongoose.connection.close();
})

2) 删除

删除一条数据

js 复制代码
BookModel.deleteOne({_id: "65c60c85df92ad81ab74d4a8"}, (err, data) => {
    // 判断
    if (err) {
        console.log("删除失败~~");
        return;
    }
    console.log(data);
});

批量删除

js 复制代码
BookModel.deleteMany({is_hot: false}, (err, data) => {
    if (err) {
        console.log("删除失败~~");
        return;
    }
    console.log(data);
});

3) 更新

更新一条

js 复制代码
BookModel.updateOne({name: "红楼梦"}, {price: 9.9}, (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log(data);
});

批量更新

js 复制代码
BookModel.updateMany({author: "余华"}, {is_hot: false}, (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log(data);
});

4) 查询

查询单条数据

js 复制代码
BookModel.findOne({name: "狂飙"}, (err, data) => {
    if (err) {
        console.log(err);
    }
    console.log(data);
});

根据id查询

js 复制代码
BookModel.findById({_id: "65c60c85df92ad81ab74d4b9"}, (err, data) => {
    if (err) {
        console.log(err);
    }
    console.log(data);
});

批量查询 (条件可以不添加则自动获取所有)

js 复制代码
BookModel.find({author: "余华"}, (err, data) => {
    if (err) {
        console.log(err);
    }
    console.log(data);
});

6) 条件控制

1) 运算符

在 mongodb 不能 > < >= <= !== 等运算符,需要使用替代符号

  • > 使用 $gt

  • < 使用 $lt

  • >= 使用 $gte

  • <= 使用 $lte

  • !== 使用 $ne

js 复制代码
db.students.find({id: {$gt: 3}}); id号比3大的所有的记录

2) 逻辑运算

$or 逻辑或的情况

js 复制代码
db.students.find({$or: [{age:18},{age:24}]});

$and 逻辑与的情况

js 复制代码
db.students.find({$and: [{age: {$lt:20}}, {age: {$gt: 15}}]});

3) 正则匹配

条件中可以直接使用 JS 的正则语法,通过正则可以进行模糊查询

js 复制代码
db.students.find({name:/刘/});
js 复制代码
db.students.find({name: new RegExp('刘')});

7) 个性化读取

1) 字段筛选

js 复制代码
//0:不要的字段
//1:要的字段
SongModel.find().select({_id:0,title:1}).exec(function(err,data){
    if(err) throw err;
    console.log(data);
    mongoose.connection.close();
});

2) 数据排序

js 复制代码
//sort 排序
//1:升序
//-1:倒序
SongModel.find().sort({hot:1}).exec(function(err,data){
    if(err) throw err;
    console.log(data);
    mongoose.connection.close();
});

3) 数据截取

js 复制代码
//skip 跳过 limit 限定
SongModel.find().skip(10).limit(10).exec(function(err,data){
    if(err) throw err;
    console.log(data);
    mongoose.connection.close();
});
相关推荐
Omics Pro5 分钟前
~30,000+引用!理论2005,R包2008,多组学集成AI增强
开发语言·数据库·人工智能·算法·机器学习·自然语言处理·r语言
呆萌很29 分钟前
数据库逻辑结构设计
数据库
howdoyoudo20260637 分钟前
当新案例冲击旧框架:分类系统的宿命与修正路径
大数据·网络·数据库·人工智能·安全·ai·分类
自己的九又四分之三站台44 分钟前
GeoPackage 到底适合什么场景:从 SQLite 容器到空间数据格式选型
数据库·oracle·sqlite
梦帮科技1 小时前
【3.0修订版】 RNS 代币架构:ERC20 五件套扩展与六钱包分配
数据结构·后端·算法·架构·node.js·区块链·php
东方护航数据恢复(深圳)1 小时前
勒索病毒加密数据库怎么办?深圳 0 赎金解密恢复实录【东方护航数据恢复深圳店】
数据库·数据恢复·服务器数据恢复·勒索病毒·数据镜像
倔强的石头_1 小时前
应用账号最小权限实践:读写账号、报表账号、运维账号分层
数据库
苦瓜打怪兽1 小时前
PostgreSQL 报错“字段 datlastsysoid 不存在”排查与解决
数据库·postgresql
XLYcmy1 小时前
PDF 论文处理器 — 技术报告文档
数据库·python·网络安全·pdf·embedding·dify·rag
ShineWinsu2 小时前
对于Redis:RDB持久化的解析
linux·数据库·redis·缓存·面试·持久化·rdb