Nodejs操作Mongodb数据库
一、在nodejs中使用Mongodb
1.新建一个文件夹,进入文件夹
npm i //初始化文件夹
2.安装操作mongodb的模块
npm install mongodb --save
3.引入mongodb
const MongoClient = require('mongodb').MongoClient;
//定义数据库的连接地址(在控制台中输入mongo ,有一个connecting to:mongodb://localhost:27017。即为mongo数据库的连接地址 )
const url = "mongodb://localhost:27017";
//定义数据库名称
const dbName = "myproject";
//实例化MongoClient
const client = new Mongodb(url);
//连接数据库
client.connect(function(err) {
if(err) {
console.log(err);
return;
}
console.log("连接成功");
const db = client.db(dbName);
//数据库操作
//1查找数据
db.collection("user").find().toArray((err, data) => {
if(err) {
console.log(err);
return;
}
console.log(data);
//操作完后关闭数据库
client.close();
})
//2.插入数据
db.collection("user").insertOne({"name": "小王"},(err, data) => {
if(err) {
consol.log(err);
return;
}
console.log("插入一条数据成功");
console.log(data);
//关闭数据库连接
client.close();
})
//3.修改数据
db.collection("user").updateOne({"name": "小王"}, {$set:{"age": 18}}, (err, data) => {
if(err) {
console.log(err);
return;
}
console.log("将name为小王的数据的age改为18");
//关闭数据库连接
client.close();
})
//4.删除数据
db.collection("user").deleteOne({"name": "小王"},(err, data) => {
if(err) {
console.log(err);
return;
}
console.log("删除一条数据成功");
client.close();
})
//5.删除多条数据
db.collection("user").deleteMany({"name": "小王"}, (err, data) => {
if(err) {
console.log(err);
return;
}
console.log("删除多条数据成功");
client.close();
})
})
另外一种连接数据库方法
MongoClient.connect(url, {useUnifiedTopology: true}, (err, client) => {
if(err) {
console.log(err)
return;
}
let db = client.db(dbName);
...
})
二、mongoose
Mongoose的两个特点
1.通过关系型数据库的思想来设计非关系型数据库
2.基于mongodb驱动,简化操作
(一)基础使用
1.安装mongoose模块
npm install mongoose --save
2.引入mongoose并连接数据库
const mongoose = require('mongoose')
mongoose.connect("mongodb://localhost:27017/eggcms") //eggcms为数据库名称
//如果有账号密码则
mongoose.connect("mongodb://eggadmin:123456@localhost:27017/eggcms")
//如果需要提醒数据库连接成功,可以在第三个参数传入回调函数 第二个参数可以不传,但是在mongo4以后会报警告
mongoose.connect("mongodb://eggadmin:123456@localhost:27017/eggcms", {useNewUrlParser: true}, (err) => {
if(err) {
console.log(err)
return
}
console.log("数据库连接成功!")
})
3.操作users表(集合),定义一个Schema
//定义数据库中users表的结构,规定类型
//Schema里面的对象和数据库的中的字段需要一一对应
//数据库中的Schema,为数据库对象的集合。schema是mongoose里会用到的一种数据模式,可以理解为表结构的定义;每个schema会映射到mongodb中的每一个collection,它不具备操作数据库的能力
const UserSchema = mongoose.schema({
name: String,
age: Number,
status: {
type: Number,
default: 1, //指定status的默认参数为1,当增加数据时没传入status,则会默认把status的值设置为1
//预定义模式修饰符
trim: true, //去掉首尾空格
lowercase: true, //转化为小写
uppercase: false, //妆化为大写
//设置索引,普通索引和唯一索引设置一个就行
index:true, //普通索引
quire:true, //唯一索引
//数据校验
required:true, //表示该数据必须传入
max:20, //用于Number数据类型,最大值
min:10, //用于Number数据类型,最小值
enum:[0,1,2] //枚举类型,要求数据必须满足枚举值,要求增加的值必须在枚举的值范围中,注意enum必须使用在string类型,不然不会生效
match:/^sn(.*)/i //增加的数据必须符合match(正则)的规则
maxlength: 20 //最大值 ,例如规定字符串的最大长度
maxlength:10 //最小值 ,例如规定字符串的最小长度
//定义一个自定义校验器
validate: (sn) => {
return sn.length >= 20 //当sn的长度大于20的时候返回true,表示验证通过,false时验证失败
}
}
})
4.定义数据库模型,操作数据库
/*
model的第一个参数,注意:
1.首字母大写
2.要和数据库表(集合)名称对应
这个模型会和模型名称相同的复数的数据库表建立连接 eg: User -> users
*/
/*
model的第二个参数,即为上面定义的Schema
*/
const User = mongoose.model("User", UserSchema);
/*
model的第三个参数,如果有第三个参数则连接第三个参数传入的值对应的数据库表
*/
const User = mongoose.model("USer", UserSchema, 'user') //连接的是user的数据库表
5.查询users表的数据
User.find({}, (err, doc) => {
if(err) {
console.log(err)
return
}
console.log(doc)
})
6.增加数据
//增加操作需要实例化
//1.实例化model,传入增加的数据
const u = new User({
name:"李四",
age:20,
status:1
})
//2.执行操作
u.save((err) => {
if(err) {
console.log(err)
return
}
console.log("增加成功")
})
7.更新数据
User.updateOne({"name":"李四"},{"name":"张三"}, (err) => {
if(err) {
console.log(err)
return
}
console.log("更新成功")
})
8.删除数据
User.deleteOne({"name":"张三"}, (err, result) => {
if(err) {
console.log(err)
return
}
console.log(result)
})
(二)Mongoose中使用聚合管道
//数据模拟
db.order.insert({"order_id":"1","uid":"10","trade_no":"111","all_price":100,"all_num":2})
db.order.insert({"order_id":"2","uid":"7","trade_no":"222","all_price":90,"all_num":2})
db.order.insert({"order_id":"3","uid":"9","trade_no":"333","all_price":20,"all_num":6})
db.order_item.insert({"order_id":"1","title":"商品鼠标1","price":50,num:1})
db.order_item.insert({"order_id":"1","title":"商品键盘2","price":50,num:2})
db.order_item.insert({"order_id":"2","title":"牛奶","price":50,"num":1})
db.order_item.insert({"order_id":"2","title":"酸奶","price":40,"num":1})
db.order_item.insert({"order_id":"3","title":"矿泉水","price":2,"num":5})
db.order_item.insert({"order_id":"3","title":"毛巾","price":10,"num":1})
表关联查询
有两个表 order 和 order_item
表order的模型为OrderModel
表oder_item的模型为OrderItemModel
OrderModel.aggregate([
{
$lookup:{
from: "order_item",
localField: "order_id",
foreignField: "order_id",
as: "items"
}
}
], (err, docs) => {
if(err) {
console.log(err)
return
}
console.log(docs)
})