mongoose
elegant mongodb object modeling for node.js
https://mongoosejs.com/
安装 mongoose
npm i mongoose
基本示例
const mongoose = require("mongoose");
// 1、连接 mongodb
let conn = mongoose.createConnection("mongodb://kaimo313:kaimo313@localhost:27017/user", {
useNewUrlParser: true,
useUnifiedTopology: true
});
conn.on("connected", () => {
console.log("链接成功");
});
// 2、Schema 骨架,根据这个骨架来创建内容,用来规范文档的
let StudentSchema = new mongoose.Schema(
{
username: {
type: String,
required: true
},
password: String,
age: Number,
birthday: {
type: Date,
default: Date.now
}
},
{
collection: "Student" // 设置固定的名字
}
);
// 3、通过骨架来创建模型 -> 集合 db.student.insert()
let Student = conn.model("Student", StudentSchema);
// 4、模型可以操作数据
Student.create({
username: "kaimo001",
password: "kaimo001",
test: "测试多余数据"
}).then((doc) => {
console.log(doc);
});
启动
nodemon mongoose.js
新增改查,分页
const mongoose = require("mongoose");
// 1、连接 mongodb
let conn = mongoose.createConnection("mongodb://kaimo313:kaimo313@localhost:27017/user", {
useNewUrlParser: true,
useUnifiedTopology: true
});
conn.on("connected", () => {
console.log("链接成功");
});
// 2、Schema 骨架,根据这个骨架来创建内容,用来规范文档的
let StudentSchema = new mongoose.Schema(
{
username: {
type: String,
required: true
},
password: String,
age: Number,
birthday: {
type: Date,
default: Date.now
},
hobby: [String]
},
{
collection: "Student" // 设置固定的名字
}
);
// 3、通过骨架来创建模型 -> 集合 db.student.insert()
let Student = conn.model("Student", StudentSchema);
// 4、模型可以操作数据
(async () => {
// 1) 批量插入:
let arr = [];
for (let i = 0; i < 4; i++) {
arr.push({
username: "kaimo" + i,
password: "kaimo" + i,
age: i
});
}
let r1 = await Student.create(arr);
console.log("批量插入----->", r1);
// 2) 查询操作:findOne 是查询一个;find 是查询一组,查询的结果只采用某个几个字段
// _id 比较特殊需要单独控制,username: 1, password: 1 表示显示该字段
let r2 = await Student.findOne({ username: "kaimo1" }, { username: 1, password: 1 });
// await Student.findById("652e81753e38c888970b3846");
console.log("查询操作----->", r2);
// 3) 修改操作 (查询条件,修改成的结果)
// 修改所有年龄大于2的,年龄都加10
// where 基本不用,性能差 ({$where: "age>2"})
// 操作符:lt: 小于 gt:大于 lte:小于等于 lgt:大于等于 inc:递增
let r3 = await Student.updateOne({ age: { $gt: 2 } }, { $inc: { age: 10 } });
console.log("修改操作--r3--->", r3);
// 加个字段,新增 set
let r4 = await Student.updateOne({ username: /kaimo1/ }, { $set: { password: "123456" } });
console.log("修改操作--r4--->", r4);
// 数组新增用 push,不重复添加用 addToSet
let r5 = await Student.updateOne({ username: /kaimo1/ }, { $push: { hobby: ["睡觉1", "睡觉2"] } });
console.log("修改操作--r5--->", r5);
// 多条件(or)删除(pop)数组第一个
let r6 = await Student.updateOne({ $or: [{ username: /kaimo1/ }, { age: 1 }] }, { $pop: { hobby: -1 } });
console.log("修改操作--r6--->", r6);
// 4) 删除
// Student.deleteOne(); Student.deleteMany();
// 5) 分页查询
let limit = 2; // 每页2条
let currentPage = 2; // 当前是第2页
let skip = (currentPage - 1) * limit;
// find 返回的是一个游标,并不是一个结果;查询 -> 排序 -> 跳过 -> 限制
let r7 = await Student.find({}).limit(limit).skip(skip).sort({ age: -1 });
console.log("分页查询--r7--->", r7);
})();
连表查询
const mongoose = require("mongoose");
// 1、连接 mongodb
let conn = mongoose.createConnection("mongodb://kaimo313:kaimo313@localhost:27017/user", {
useNewUrlParser: true,
useUnifiedTopology: true
});
conn.on("connected", () => {
console.log("链接成功");
});
// 学生模型
let StudentSchema = new mongoose.Schema(
{
username: {
type: String,
required: true
},
password: String,
age: Number,
birthday: {
type: Date,
default: Date.now
},
hobby: [String]
},
{
collection: "Student" // 设置固定的名字
}
);
let Student = conn.model("Student", StudentSchema);
// 作业模型
let HomeWorkSchema = new mongoose.Schema(
{
title: String,
content: String,
student: {
ref: "Student",
type: mongoose.SchemaTypes.ObjectId // 用户id
}
},
{
collection: "Homework" // 设置固定的名字
}
);
let HomeWork = conn.model("Homework", HomeWorkSchema);
(async () => {
let user = await Student.create({ username: "kaimo666", password: "123456" });
let home = await HomeWork.create({
title: "第一篇作业",
content: "第一篇作业的内容",
student: user._id
});
console.log(home);
// 连表查询
let r = await HomeWork.findById("653538ed066785338ab72d81").populate("student", { username: 1 });
console.log("连表查询--r-->", r);
// 修改:通过模型来操作;通过文档自己操作自己
r.title = "修改后的标题";
await r.save();
})();