Express 与 MongoDB 入门

因为数学一直很差,然后对数据库也是莫名的恐惧,曾经看过《 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

安装:

brew install mongodb

启动:

mongod

连接:

mongo

操作:

show dbs //列出所有的数据库
use test //转到test库

Mongoose

Mongoose是对MongoDB进行建模封装的工具,用于操作MongoDB。详见mongoosejs文档

安装:

npm install mongoose

数据库连接:

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