Mongodb 以及 node.js中使用mongoose操作数据库-消息

博客园   2023-05-15 14:10:48

Mongodb 以及 node.js中使用mongoose操作数据库

1、lowdb

一个简陋的数据库第三方库,使用JSON文件来保存数据,进行增删改查。

在没有数据库或者数据量小到不使用数据库的时候可以使用,了解即可。


【资料图】

2、Mongodb是什么?

MongoDB是一个基于分布式文件存储的数据库。

相比于纯文件管理数据,数据库管理数据有如下的特点:

为什么选择Mongodb,因为它的操作语法与JS类似,容易上手,学习成本低。

3、Mongodb核心概念

4、Mongodb的下载与使用

下载地址:https://www.mongodb.com/try/download/community

建议选择zip类型,通用性更强。

配置步骤如下:

看到waiting for connections就表明服务启动成功。

客户端程序

注意:

5、数据库与集合命令

5.1、数据库命令

5.2、集合命令

5.3、文档命令

6、Mongoose

Mongoose是一个对象文档模型库。

方便我们使用代码去操作mongodb数据库。

npm i mongoose@6

// 导入mongooseconst mongoose = require("mongoose");// 连接mongoose服务mongoose.connect("mongodb://127.0.0.1:27017/bilibili"); // 如果bilibili数据库不存在会自动创建// 设置回调mongoose.connection.on("open", () => {    console.log("连接成功");}); // 连接成功回调mongoose.connection.on("error", () => {    console.log("连接失败");}); // 连接失败回调mongoose.connection.on("close", () => {    console.log("连接关闭");}); // 连接关闭回调// 关闭mongodb的连接setTimeout(() => {    mongoose.disconnect();}, 3000);

6.1、插入文档

// 导入mongooseconst mongoose = require("mongoose");// 连接mongoose服务mongoose.connect("mongodb://127.0.0.1:27017/bilibili"); // 如果bilibili数据库不存在会自动创建// 设置回调mongoose.connection.on("open", () => {    // 创建文档的结构对象,设置集合中文档的属性以及属性值的类型    let BookSchema = new mongoose.Schema({        name: String,        author: String,        price: Number    });    // 创建模型对象,对文档操作的封装对象    let BookModel = mongoose.model("book", BookSchema);    // 新增    // BookModel.create({    //     name: "西游记",    //     author: "吴承恩",    //     price: 19.9    // }, (err,data) => {    //     if (err) {    //         console.log(err);    //         return;    //     }    //     // 如果没出错,则输出插入后的文档对象    //     console.log(data);    // });    // 新增多条    BookModel.insertMany([{        name: "西游记",        author: "吴承恩",        price: 19.9    },{        name: "西游记",        author: "吴承恩",        price: 19.9    },{        name: "西游记",        author: "吴承恩",        price: 19.9    }], (err,data) => {        if (err) {            console.log(err);            return;        }        // 如果没出错,则输出插入后的文档对象        console.log(data);    });}); // 连接成功回调mongoose.connection.on("error", () => {    console.log("连接失败");}); // 连接失败回调mongoose.connection.on("close", () => {    console.log("连接关闭");}); // 连接关闭回调

6.2、字段类型

String:字符串

Number:数字

Boolean:布尔值

Array:数组

Date:日期

Buffer:Buffer对象

Mixed:任意类型,需要使用mongoose.Schema.Types.Mixed指定

ObjectId:对象ID,需要使用mongoose.Schema.Types.ObjectId指定

Decimal128:高精度数字,需要使用mongoose.Schema.Types.Decimal128指定

6.3、字段值验证

6.3.1、必填项

title: {  type: String,  required: true}

6.3.2、默认值

author: {  type: String,  default: "匿名"}

6.3.3、枚举值

sex: {  type: String,  enum: ["男", "女"]}

6.3.4、唯一值

username: {  type: String,  unique: true,}

unique需要重建集合才有效果。永远不要相信用户的输入。

6.4、删除文档

// 导入mongooseconst mongoose = require("mongoose");// 连接mongoose服务mongoose.connect("mongodb://127.0.0.1:27017/bilibili"); // 如果bilibili数据库不存在会自动创建// 设置回调mongoose.connection.on("open", () => {    // 创建文档的结构对象,设置集合中文档的属性以及属性值的类型    let BookSchema = new mongoose.Schema({        name: String,        author: String,        price: Number    });    // 创建模型对象,对文档操作的封装对象    let BookModel = mongoose.model("book", BookSchema);    // 删除一条    BookModel.deleteOne({_id: "6461be48670777b4e3f2bfcc"}, (err, data) => {        if (err) {            console.log(err);            return;        }        console.log(data);    });    // 批量删除    BookModel.deleteMany({is_hot: false}, (err, data) => {        if (err) {            console.log(err);            return;        }        console.log(data);    });}); // 连接成功回调mongoose.connection.on("error", () => {    console.log("连接失败");}); // 连接失败回调mongoose.connection.on("close", () => {    console.log("连接关闭");}); // 连接关闭回调

6.5、更新文档

// 导入mongooseconst mongoose = require("mongoose");// 连接mongoose服务mongoose.connect("mongodb://127.0.0.1:27017/bilibili"); // 如果bilibili数据库不存在会自动创建// 设置回调mongoose.connection.on("open", () => {    // 创建文档的结构对象,设置集合中文档的属性以及属性值的类型    let BookSchema = new mongoose.Schema({        name: String,        author: String,        price: Number    });    // 创建模型对象,对文档操作的封装对象    let BookModel = mongoose.model("book", BookSchema);    // 更新一条    // BookModel.updateOne({name: "西游记"}, {price: 9.9}, (err,data) => {    //     // 判断err    //     if (err) {    //         console.log("更新失败");    //         return;    //     }    //     console.log(data);    // });    // 批量更新    BookModel.updateMany({name: "西游记"}, {price: 9.9}, (err,data) => {        // 判断err        if (err) {            console.log("更新失败");            return;        }        console.log(data);    });}); // 连接成功回调mongoose.connection.on("error", () => {    console.log("连接失败");}); // 连接失败回调mongoose.connection.on("close", () => {    console.log("连接关闭");}); // 连接关闭回调

6.6、查询文档

// 导入mongooseconst mongoose = require("mongoose");// 连接mongoose服务mongoose.connect("mongodb://127.0.0.1:27017/bilibili"); // 如果bilibili数据库不存在会自动创建// 设置回调mongoose.connection.on("open", () => {    // 创建文档的结构对象,设置集合中文档的属性以及属性值的类型    let BookSchema = new mongoose.Schema({        name: String,        author: String,        price: Number    });    // 创建模型对象,对文档操作的封装对象    let BookModel = mongoose.model("book", BookSchema);    // 查询单条    BookModel.findOne({name: "西游记"}, (err, data) => {        if (err) {            console.log(err);            return;        }        console.log(data);    });    // 根据ID获取文档    BookModel.findById("6461c222f73d78ca0b9fd980", (err, data) => {        if (err) {            console.log(err);            return;        }        console.log(data);    });    // 批量获取(有条件)    BookModel.find({author: "吴承恩"}, (err, data) => {        if (err) {            console.log(err);            return;        }        console.log(data);    });    // 无条件,读取所有    BookModel.find((err, data) => {        if (err) {            console.log(err);            return;        }        console.log(data);    });}); // 连接成功回调mongoose.connection.on("error", () => {    console.log("连接失败");}); // 连接失败回调mongoose.connection.on("close", () => {    console.log("连接关闭");}); // 连接关闭回调

6.7、条件控制

6.7.1、运算符

在mongodb中,不能用><等运算符,要使用替代符号:

db.students.find({id:{$gt:3}}); id号比3大的所有文档

6.7.2、逻辑运算

$or逻辑或的情况

db.students.find({$or:[{age:18}, {age:24}]});

$and逻辑与的情况

db.students.find({$and:[{age:18}, {age:24}]});

6.7.3、正则匹配

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

db.students.find({name:/imissyou/});

6.8、mongoose个性化读取

6.7.1、字段筛选

SongModel.find().select({_id:0, title:1}).exec(function(err, data) {  if (err) throw err;  console.log(data);  mongoose.connection.close();})

6.7.2、数据排序

SongModel.find().sort({hot:1}).exec(function(err, data) {  if (err) throw err;  console.log(data);  mongoose.connection.close();})

6.7.3、数据截取

// skip跳过,limit限定SongModel.find().skip(10).limit(10).exec(function(err, data) {  if (err) throw err;  console.log(data);  mongoose.connection.close();})

7、mongodb图形化管理工具

7.1、robo3t

去github上下载,免费

7.2、Navicat

收费

[ 最近更新 ]