Mongoose

Mongoose

概述

Mongoose 是一个对象文档模型库,方便使用代码操作 mongodb 数据库。

官网: http://www.mongoosejs.net/

安装Mongoose

npm install mongoose

连接数据库

// 导入mongoose包
const mongoose = require("mongoose");

// 严格查询模式
mongoose.set("strictQuery", true);

// 连接mongodb服务
mongoose.connect("mongodb://127.0.0.1:27017/test_db");

// 连接成功回调
// once表示回调函数只会执行一次,这里也可以使用on
mongoose.connection.once("open", () => {
  console.log("连接成功");
});

// 连接失败回调
mongoose.connection.on("error", () => {
  console.log("连接失败");
});

// 连接关闭回调
mongoose.connection.on("close", () => {
  console.log("连接关闭");
});

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

创建文档结构

// 导入mongoose
const mongoose = require("mongoose");

// 严格查询模式
mongoose.set("strictQuery", true);

// 连接mongodb服务
mongoose.connect("mongodb://127.0.0.1:27017/test_db");

// 连接成功回调
// once表示回调函数只会执行一次,这里也可以使用on
mongoose.connection.once("open", () => {
  console.log("连接成功");
  // 创建文档结构对象
  let BookSchema = new mongoose.Schema({
    title: String,
    author: String,
    price: Number,
  });
  // 创建文档模型对象
  let BookModel = mongoose.model("books", BookSchema);
    
  // 插入文档
  BookModel.create(
    {
      title: "西游记",
      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("连接关闭");
});

字段类型

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

类型说明
String字符串
Number数字
Boolean布尔值
Array数组,可以用[]表示
Date日期
BufferBuffer对象
Mixed任意类型,需要使用mongoose.Schema.Types.Mixed指定
ObjectId对象id,需要使用mongoose.Schema.Types.ObjectId指定
Decimal128高精度数字,需要使用mongoose.Schema.Types.Decimal128指定

字段验证

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

// 导入mongoose
const mongoose = require("mongoose");

// 严格查询模式
mongoose.set("strictQuery", true);

// 连接mongodb服务
mongoose.connect("mongodb://127.0.0.1:27017/test_db");

// 连接成功回调
// once表示回调函数只会执行一次,这里也可以使用on
mongoose.connection.once("open", () => {
  console.log("连接成功");
  // 创建文档结构对象
  let BookSchema = new mongoose.Schema({
    title: {
      type: String,
      required: true, //设置必填项
    },
    username: {
      type: String,
      unique: true, //设置唯一值
    },
    author: {
      type: String,
      default: "未命名", //设置默认值
    },
    gender: {
      type: String,
      enum: ["男", "女"], //设置枚举值
    },
    price: Number,
  });
  // 创建文档模型对象
  let BookModel = mongoose.model("books", BookSchema);
  // 插入文档
  BookModel.create(
    {
      title: "西游记",
      username: "小明",
      author: "吴承恩",
      gender: "男",
      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("连接关闭");
});

增删改查

插入一条

BookModel.create(
  {
    title: "西游记2",
    username: "小明2",
    author: "吴承恩2",
    gender: "女",
    price: 19.9,
  },
  (err, data) => {
    if (err) {
      console.log(err);
      return;
    }
    console.log(data);
  }
);

插入多条

BookModel.insertMany(
  [
    {
      title: "西游记3",
      username: "小明3",
      author: "吴承恩3",
      gender: "女",
      price: 19.9,
    },
    {
      title: "西游记4",
      username: "小明4",
      author: "吴承恩4",
      gender: "女",
      price: 19.9,
    },
  ],
  (err, data) => {
    if (err) {
      console.log(err);
      return;
    }
    console.log(data);
  }
);

删除一条

BookModel.deleteOne({ title: "西游记1" }, (err) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log("删除成功");
});

删除多条

BookModel.deleteMany({ gender: "女" }, (err) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log("删除成功");
});

更新一条

BookModel.updateOne({ author: "吴承恩" }, { author: "吴承恩2" }, (err) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log("更新成功");
});

更新多条

BookModel.updateMany({ author: "吴承恩2" }, { author: "吴承恩" }, (err) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log("更新成功");
});

查询一条

BookModel.findById("643cf1abb04ee1849e937759", (err, data) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log(data);
});
BookModel.findOne({ title: "西游记" }, (err, data) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log(data);
});

查询多条

BookModel.find((err, data) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log(data);
});
BookModel.find({ gender: "女" }, (err, data) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log(data);
});

条件控制

在mongodb中不能使用一些运算符,因此需要使用替代符号:

运算符替代符号
>$gt
<$lt
>=$get
<=$lte
!==$ne
逻辑或$or
逻辑与$and
db.students.find({age:{$gt:30}});
db.students.find({$or:[{age:18},{age:24}]});
db.students.find({$and: [{age: {$lt:20}}, {age: {$gt: 15}}]});
// 正则表示
db.students.find({name:/imissyou/});

个性化读取

字段筛选

0表示不要的字段,1表示需要的字段。

BookModel.find()
  .select({ _id: 0, username: 1, title: 1 })
  .exec((err, data) => {
    if (err) {
      console.log(err);
      return;
    }
    console.log(data);
  });

说明:只会输出username和title字段的数据。

数据排序

可以使用sort排序,1表示升序,-1表示倒序。

BookModel.find()
  .sort({ author: 1 })
  .exec((err, data) => {
    if (err) {
      console.log(err);
      return;
    }
    console.log(data);
  });

数据截取

skip跳过。

limit限制。

BookModel.find()
  .skip(2)
  .limit(2)
  .exec((err, data) => {
    if (err) {
      console.log(err);
      return;
    }
    console.log(data);
  });

模块化

在这里插入图片描述

config/config.js

module.exports = {
  DB_HOST: "127.0.0.1",
  DB_PORT: 27017,
  DB_NAME: "mydb",
};

db/db.js

const { DB_HOST, DB_PORT, DB_NAME } = require("../config/config.js");
const mongoose = require("mongoose");

module.exports = function (
  success,
  error = () => {
    console.log("连接失败");
  }
) {
  // 设置 strictQuery 为 true
  mongoose.set("strictQuery", true);
  // 连接服务
  mongoose.connect(`mongodb://${DB_HOST}:${DB_PORT}/${DB_NAME}`);
  // 连接成功回调
  mongoose.connection.once("open", () => {
    success();
  });
  // 连接失败回调
  mongoose.connection.once("error", () => {
    error();
  });
  // 连接关闭回调
  mongoose.connection.once("close", () => {
    console.log("连接关闭");
  });
};

models/BookModel.js

const mongoose = require("mongoose");
// 文档结构对象
let BookSchema = new mongoose.Schema({
  name: String,
  author: String,
  price: Number,
});
// 文档模型对象
let BookModel = mongoose.model("books", BookSchema);
// 暴露
module.exports = BookModel;

index.js

const db = require("./db/db.js");
const BookModel = require("./models/BookModel.js");

db(() => {
  BookModel.create(
    {
      name: "西游记",
      author: "小明",
      price: 18.8,
    },
    (err, data) => {
      if (err) {
        console.log(err);
        return;
      }
      console.log(data);
    }
  );
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值