因为数学一直很差,然后对数据库也是莫名的恐惧,曾经看过《 SQL 必知必会》,但也只是对 SQL 语法有点了解,具体怎么用其他语言操作数据库一直不解。最近在慕课网看到 Scott 老师的 node+mongodb 建站攻略(一期) 一下子豁然开朗,原来我也可以学得会,而且跟数学没什么关系~~
简要介绍
MongoDB的逻辑结构是一种层次结构,主要由:文档(document)、集合(collection)、数据库(database)这三部分组成的。
文档(document):由键/值对构成,像{a:1};{s:”abc”}等,它是MongoDB核心单元,MongoDB的文档(document),相当于关系数据库中的一行记录。
集合(Collection):多个文档组成一个集合(collection),相当于关系数据库的表。
数据库(database):多个集合(collection),逻辑上组织在一起,就是数据库(database)。
一个MongoDB实例支持多个数据库(database)。
MongoDB
安装:
启动:
连接:
操作:
show dbs //列出所有的数据库 use test //转到test库
|
Mongoose
Mongoose是对MongoDB进行建模封装的工具,用于操作MongoDB。详见mongoosejs文档
安装:
数据库连接:
var mongoose = require("mongoose") mongoose.connect("mongodb://localhost:3000/mydb")
|
Mongoose包括:
Schema、Model、Entity的关系请牢记,Schema生成Model,Model创造Entity,Model和Entity都可对数据库操作造成影响,但Model比Entity更具操作性。
Schema模式:对数据、字段进行定义————
//schemas/movie.js var mongoose=require("mongoose") var MovieSchema=new mongoose.Schema({ director:String, title:String, language:String, country:String, year:Number, meta:{ createAt:{ type:Date, default:Date.now() }, updateAt:{ type:Date, default:Date.now() } } }) //每次存储数据前都会调用 MovieSchema.pre("save",function(next){ if(this.isNew){ this.meta.createAt=this.meta.updateAt=Date.now()//如果是新数据则将创建时间和更新时间存为同一个 }else{ this.meta.updateAt=Date.now } next() }) //静态方法,不和数据库直接交互,经过model编译实例化以后才会具有这个方法 MovieSchema.statics={ fetch:function(cb){ return this .find({}) .sort("meta.updateAt") .exec(cb) }, findById:function(id,cb){ return this .findOne({_id:id}) .exec(cb) } } module.exports=MovieSchema
|
Model模型:对传入的模式进行编译生成构造函数————
//models/movie.js var mongoose=require("mongoose") var MovieSchema=require("../schemas/movie.js") var Movie=mongoose.model("Movie",MovieSchema)//生成模型model module.exports=Movie
|
Documents文档:实例化构造函数,查询数据库————
//文档实例化
var Movie=require("./models/movie.js") var movie=new Movie({ director:"李安", title:"少年派的奇幻之旅", language:"英语", country:"美国", year:2016 }) movie.save(function(err){ if(err){ return handleError(err) } })
|
//批量查询
// Model.find(query, fields, options, callback) // fields范围 和 options 都是可选参数 var Movie=require("./models/movie.js") app.get("/",function(req,res){ Movie.find({}) .exec(function(err,movies){ res.render("index",{ title:"标题", movies:movies }) }) })
|
//单条查询
var Movie=require("./models/movie") app.get("/",function(req,res){ Movie.findOne({_id:id}) // _id是主键 .exec(function(err,movies){ res.render("index",{ title:"标题", movies:movies }) }) })
|
//按id查询
var Movie=require("./models/movie") app.get("/",function(req,res){ Movie.findById(id,function(err,movies){ res.render("index",{ title:"标题", movies:movies }) }) })
|
//单条删除
var Movie=require("./models/movie") app.get("/",function(req,res){ Movie.remove({_id:id},function(err,movie){ if(err){ console.log(err) } }) })
|
//查询数量,返回符合条件的文档数
//Model.count(conditions, callback); var Movie=require("./models/movie") app.get("/",function(req,res){ Movie.count({_id:id},function(err,movie){ if(err){ console.log(err) } }) })
|
//基于实例方法的查询
// 添加 mongoose 实例方法 mongooseSchema.methods.findbyusername = function(username, callback) { return this.model('mongoose').find({username: username}, callback); } var mongooseEntity = new mongooseModel({}); mongooseEntity.findbyusername('model_demo_username', function(error, result){ if(error) { console.log(error); } else { console.log(result); } //关闭数据库链接 db.close(); });
|
//基于静态方法的查询
// 添加 mongoose 静态方法,静态方法在Model层就能使用 mongooseSchema.statics.findbytitle = function(title, callback) { return this.model('mongoose').find({title: title}, callback); } mongooseModel.findbytitle('emtity_demo_title', function(error, result){ if(error) { console.log(error); } else { console.log(result); } //关闭数据库链接 db.close(); });
|
//增加
// 增加记录 基于 entity 操作 var doc = {username : 'emtity_demo_username', title : 'emtity_demo_title', content : 'emtity_demo_content'}; var mongooseEntity = new mongooseModel(doc); mongooseEntity.save(function(error) { if(error) { console.log(error); } else { console.log('saved OK!'); } // 关闭数据库链接 db.close(); });
|
//增加2
// 增加记录 基于model操作 var doc = {username : 'model_demo_username', title : 'model_demo_title', content : 'model_demo_content'}; mongooseModel.create(doc, function(error){ if(error) { console.log(error); } else { console.log('save ok'); } // 关闭数据库链接 db.close(); });
|
//修改
// 修改记录 mongooseModel.update(conditions, update, options, callback); var conditions = {username : 'model_demo_username'}; var update = {$set : {age : 27, title : 'model_demo_title_update'}}; var options = {upsert : true}; mongooseModel.update(conditions, update, options, function(error){ if(error) { console.log(error); } else { console.log('update ok!'); } //关闭数据库链接 db.close(); });
|
//修改2, 通过 Model.findByIdAndUpdate(id, [update], [options], [callback])
var id='59fa714f16ee5b557824b8e5'; var updatestr={'usersex':'nu'}; //通过主键 _id 来实现更新 User.findByIdAndUpdate (id,updatestr,function(err,res){ if (err) { console.log("Error:" + err); } else { console.log("Res:" + res); } }
|
参考:
http://blog.csdn.net/hsany330/article/details/51970783
https://cnodejs.org/topic/504b4924e2b84515770103dd