用Nodejs操作mongodb结合Schema实现数据库操作
Mongoose
Mongoose是一个第三方的用于操作mongodb的库,与之前一篇文章中直接使用原生的由mongodb提供的CURD来直接操作数据库不同,在Mongoose中提供了更高层的抽象,增加了自动检查的机制。其主要结构如下:
Schema在node.js中的mongoose库中,主要作用是作为一个模板,通过这个模板可以映射到数据库和数据表。同时在Schema下面一个层级还有Model,通过Model可以创建一个数据文档对象,通过这个对象就可以实现对数据库的增删改查操作。
创建Schema
var productSchema = new Schema({
name:String,
type:String,
price:Number,
innum:Number,
indate:Date,
outnum:Number,
{
type: Date,
default: Date.now
}
})
定义Schema对象并映射到数据库
var productmodel = mongoose.model("product", productSchema);
Model的使用
创建文档内容
Model.create(doc(s),[callback])
- doc:文档对象,可以一次性传入多个对象。
- callback:回调函数,返回新增的内容。
删除文档内容
//删除所有符合条件
Model.remove(conditions, [callback])
//删除一条记录
Model.deleteOne(conditions, [callback])
//删除多条记录
Model.deleteMany(conditions, [callback])
- conditions:删除对象匹配条件
- callback:回调函数。
修改文档内容
//更新所有符合条件
Model.update(conditions, doc, options, callback)
//更新多条符合条件
Model.updateMany(conditions, doc, options, callback)
//更新一条
Model.updateOne(conditions, doc, options, callback)
- conditions:修改对象匹配条件
- doc:修改以后的内容,如果需要不是覆盖修改,则需要添加$set字段用于约束。
- options:修改选项,用来传multi参数,一般情况用不上。
- callback:回调函数
查询文档内容
//查询所有符合条件的文档
Model.find(conditions, [projection], [options], [callback])
//根据文档的id属性查询文档
Model.findByID(id, [projection], [options], [callback])
//查询符合条件的第一个文档
Model.findOne([conditions], [projection], [options], [callback])
- conditions:表示查询的条件,可以加上{name:“张三”}用来查询张三相关的数据字段。
- projections:表示投影,可以设置投影实现仅查询返回部分字段的内容。比如可以设置**{name:1,_id:0}表示仅返回名字字段不返回_id字段;同样的也能通过字符串的形式进行限制,如"name -_id",条件之间加上空格,另外负号表示不返回**。
- options:查询选项,比如skip,limit,可以通过这个功能实现分页操作
- callback:回调函数,将查询的结果返回,格式是数组。
Document的使用
创建并保存
//创建一个文档,直接实例化一个model就可以实现
var prodoc = new productmodel({
name:"旺仔",
type:"食品",
price:6,
innum:100,
indate:2023-04-05,
outnum:20,
outdate:2023-04-08
})
prodoc.save(function(err)){
if(!err){
console.log("数据添加成功!");
}
}
将文档对象转换为JSON对象
在向用户显示数据的时候会遇到想要只向用户展示一部分的数据字段而不想展示所有的数据字段的情况,同时还不想删除数据库中的内容,这时候就需要将文档对象转换成JSON,变成一个单独用来存储数据的格式。需要注意的是转换以后Document相关的方法都没法使用了。
doc = doc.toObject()
//删除数据对象中的price字段
Delete doc.price;
模块化
数据库连接
新建一个connection.js的文件用于封装连接数据库的操作
const mongoose = require("mongoose");
mongoose.connect("mongodb://127.0.0.1/shop");
mongoose.connection.once("open",function() {
console.log("数据库连接成功~~~");
});
再别的文件中只需要:
require("./tools/connection")
就可以实现连接,而不用每次连接都要在代码前面写这么长一串内容。
模型初始化
创建models文件夹,然后创建一个名称为product的js文件,如果有需要仅仅需要在这个文件夹下面继续新建模块就可以了。
var mongoose = require("mongoose")
var Schema = mongoose.Schema;
var productSchema = new Schema({
name:String,
type:String,
price:Number,
innum:Number,
indate:Date,
outnum:Number,
outdate:{
type: Date,
default: Date.now
}
});
var productmodel = mongoose.model("product",productSchema);
//将上述代码导出为模块
module.export = Productmodel;
在其他的文件中只需要以下代码就可以调用:
const product = require("./models/product")
项目部署
路由定义
const express = require("express");
const router = express.Router();
const operation = require("../tools/opra");
const { ObjectId } = require("mongodb");
//新增数据
router.post("/add",async(req,res)=>{
let result = await operation.insert([{
"name": "taddy",
"type":"toy",
"price": 15,
"innum":20,
"indate":new Date("October 13, 2023 11:13:00"),
"outnum":13,
"outdate":new Date("October 13, 2023 15:13:00")
}])
res.send("数据新增成功!" + result);
})
//删除数据
router.delete("/:name", async(req, res)=>{
try {
var name = req.params;
var result = await operation.remove({name:name});
res.send("删除成功");
return result;
} catch (err) {
res.send(err);
}
})
//修改数据
router.put("/:name",async(req,res)=>{
var name = req.params;
var newdata = req.body;
try{
let result = await operation.update({name:name},newdata);
res.send("数据修改成功");
return result;
}catch (err) {
res.send("数据修改失败")
}
})
//查询数据
router.get("/search/:name", async(req, res)=>{
let name = req.params;
var projection = "name -_id type price innum outnum indate outdate";
var result = await operation.search({name:name},projection,function(err){
if(!err){
console.log("查询成功!");
}else{
console.log(err);
}
})
return result;
})
//汇总数据
module.exports = router;
后端操作定义
require("./connections");
const product = require("../models/product");
//增操作
async function insert(doc){
product.create(doc,function(err){
if(!err) {
console.log("数据插入成功");
}else{
console.log(err);
}
})
}
//删操作
async function remove(query){
product.remove(query,function(err){
if(!err) {
console.log("删除成功!");
}else{
console.log(err);
}
})
}
//改操作
async function update(query, newdata){
product.update(query, newdata,function(err){
if(!err) {
console.log("数据更新成功");
}else{
console.log(err);
}
})
}
//查操作
async function search(query,projection){
result = product.find(query,projection,function(err){
if(!err) {
console.log("查询成功");
}else{
console.log(err);
}
})
return result;
}
//数据汇总
async function sumup(){
//调用aggregate方法
}
module.exports = {
insert,
remove,
update,
search,
sumup
}
启动服务
const express = require("express")
const app = new express()
const router = require("./router/router")
app.use("/",router)
app.listen(80, ()=>{
console.log("server running on localhost")
})