MongoDB object modeling designed to work in an asynchronous environment. http://mongoosejs.com

结缘的功能设想-初步中我们为结缘的用户字段进行了定义,在本篇中我们使用Mongoose为用户模型进行数据库建模。Mongoose是基于nodejs的mongodb ORM,类似java的Hibernate。

PS: 本文假设您已经安装了mongodb环境.

可以查看结缘的代码加深理解.

连接数据库

首先安装mongoose模块

1
$ npm install mongoose

config文件夹下新建mongoose.js文件,写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
var config = require('./config'),
mongoose = require('mongoose');
module.exports = function(){
var db = mongoose.connect(config.db,function(err) {
if(err) {
console.log('connection error', err);
} else {
console.log('connection successful : ' + config.db);
}
});
return db;
};

bin/www文件首部添加如下代码:

1
2
3
4
process.env.NODE_ENV = process.env.NODE_ENV || 'development'; //设置默认环境为development
var Mongoose = require('../config/mongoose');
var db = Mongoose();

安装nodemon模块,该工具可以帮助我们在改变代码时自动重启应用,免去手动重启的麻烦.

1
$ npm install -g nodemon

然后我们验证代码有无错误,首先开启数据库sudo mongod,然后使用nodemon启动

1
$ nodemon

输出connection successful字样即为配置正确。

创建用户模型

models文件夹下创建model_user.js文件,根据我们在结缘的功能设想-初步中对用户的建模,写入如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
name: String,
username: {
type: String,
unique: true,
trim: true,
required: true,
index: true
},
email: {
type: String,
validate: {
validator: function(email) {
return /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/.test(email);
},
message: '{VALUE} is not a valid email!'
}
},
password: {
type: String,
required: true
},
state: {
type: String,
enum: ["single", "inlove"]
},
gender: {
type: String,
enum: ["male", "female", "unknown"],
default: "unknown"
},
phone_no: String,
accessToken: String,
avatar: String,
location: String,
url: String,
signature: String,
created_at: {
type: Date,
default: Date.now
},
updated_at: Date
});
UserSchema.set('autoIndex', false);
// on every save, add the date
userSchema.pre('save', function(next) {
var currentDate = new Date();
this.updated_at = currentDate;
next();
});
module.exports = mongoose.model('User', UserSchema);

Schema定义了用户的数据结构,model将其建模,这里我们取模型为User,mongoose将为我们自动创建userscollection。这里后面会添加很多自定义方法,目前暂时是最基础的形式。

Mongoose也为我们提供了很多方便的验证器,如required,unique,enum等,同时也提供了自定义验证器validate,详细请查阅文档validator

使用index索引可以加快查询速度,但建立索引需要代价,应该给那些经常需要索引的列增加索引,另外应用启动的时候Mongoose会自动为每一个schema发送一个ensureIndex命令,开发环境用这个很好, 但是建议在生产环境不要使用这个,使用下面的方法禁用ensureIndex:

1
2
3
animalSchema.set('autoIndex', false);
//or
new Schema({}, {autoIndex: false});