mongoose

mongodb固然好,但是orm没有很好的实现,不过业界首推mongoose,怎么说呢跟其他的orm很类似,不过很多方便的小技巧,看了下文档,打算梳理一遍

schemas

由于mongodb是非关系型数据库,可以直接在程序中定义实体,然后写入数据库,schemas的类型基本常规类型都有,跟关系型数据库最大的区别是可以嵌套,怎么理解呢,比如定义一个实体,大概是这样的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var blogSchema = new Schema({
title: String,
author: String,
body: String,
comments: [{ body: String, date: Date }],
date: { type: Date, default: Date.now },
hidden: Boolean,
meta: {
votes: Number,
favs: Number
}
});

这里有个思维上的惯性,就是关系型数据库用在复杂逻辑关系的事务中,不过既然如果业务场景选择了no-sql,意味着简单大量的数据是主力,那么定义一个实体就是一件比较讲究的事情了,因此如果能把业务逻辑包含起来,比如一个一个留言应用可以这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const mongoose = app.mongoose;
const MessagesSchema = new mongoose.Schema({
id: { type: Number, required: true, unique: true },
appName: { type: String, required: true },
appUrl: { type: String ,default:''},
isNeedLogin: { type: Boolean, default: false },
limitCount: { type: Number, default: 10 },
adminList: { type: Array },
status: { type: Number, default: 1 },
createTime: { type: Date, default: Date.now },
messages: [
{
username: { type: String },
avatar: { type: String },
createTime: { type: Date, default: Date.now },
isChecked: { type: Boolean, default: false },
checkedBy: { type: String },
ip: { type: String },
url: { type: String }
}
]
});
return mongoose.model("messages", MessagesSchema);

以上的例子就是 把 messages嵌套在里面