好文章 https://www.jianshu.com/p/2f54b90efe15
最常接触到的有三个概念Schema
、Model
、Entity
。按自己理解,Schema
是定义数据库的结构。类似创建表时的数据定义,但比创建数据库可以做更多的定义,只是没办法通过Schema对数据库进行更改。Model
是将Schema定义的结构赋予表名。但可用此名对数据库进行增删查改。Entity
是将Model与具体的数据绑定,可以对具体数据自身进行操作,例如保存数据
Schema
Schema用来定义数据库文档结构,数据库有什么字段、字段是什么类型、默认值、主键之类的信息。除了定义结构外,还能定义文档的实例方法,静态模型方法,复合索引,中间件等。详情查看mongoose官方文档。
在引入Mongoose模块var mongoose = require('mongoose')
的js文件中进行操作。
var blogSchema = new mongoose.Schema({
title: String,
comments: [{ body: String, date: Date }],
date: { type: Date, default: Date.now },
hidden: Boolean,
meta: {
votes: Number,
favs: Number
}
})
这样即定义了一个名为blogSchema
的Schema。
如需再添加数据,用add
方法。
blogSchema.add( { author: String, body: String} );
资料中介绍,Shema
不仅定义了文档的结构和属性,还可以定义文档的插件、实例方法、静态方法、复合索引文档生命周期钩子,具体还需查看官方文档。
Schema.Type
Schema.Type
是Mongoose内部定义的数据类型。基本类型有:String
、Number
、Date
、Boolean
、Array
、Buffer
、Mixed
、ObjectId
。
Mixed
混合数据类型,可以直接定义{}
来使用,以下两种形式等价。
new Schema({mixed: {Schema.Types.Mixed} });
new Schema({mixed: {} });
ObjectId
储存在数据库中的每个数据都会有默认的主键_id
,默认存储的是ObjectId
。ObjectId
是一个12字节的BSON
类型字符串。按照字节顺序依次代表:
4字节:UNIX时间戳
3字节:表示运行MongoDB的机器
2字节:表示生成此_id的进程
3字节:由一个随机数开始的计数器生成的值
Model
var blogModel = mongoose.model('Blog', blogSchema);
将名为blogSchema
的Schema与Blog
名字绑定,即是存入数据库的名字,但存入数据库中的名字是Blogs
,会自动添加一个s
。
这里将Model命名为blogModel
,需要对Blog
表操作的话,都需要使用变量名blogModel
。
Entity
可以绑定具体数据对Model实例化。
var blogEntity = new blogModel({
title: "Mongoose",
author: "L",
body: "Documents are instances of out model. Creating them and saving to the database is easy",
comments: [{ body: "It's very cool! Thanks a lot!", date: "2014.07.28" }],
hidden: false,
meta: {
votes: 100,
favs: 99
}
})
这里将名为blogModel
的Model实例化。之后我们可以用blogEntity
名对数据进行保存并执行回调。
blogEntity.save(function(err, docs){
if(err) console.log(err);
console.log('保存成功:' + docs);
})
在平常使用SQL语句操作数据库时,取得数据后先组织成SQL语句,然后放入执行语句中执行。这里理解也是类似,取得数据先进行实例化,这一步类似于组织成SQL语句,然后再做具体操作例如上面的Save
操作。但由于Node.js是异步操作,所以返回的数据利用回调函数来进行操作。
知道了以上概念后就可以对数据进行操作了,下面将列出一些常用的资料,并附上相应的例子。
增(C)
var doc = ({
title: "Mongoose",
author: "L",
body: "Documents are instances of out model. Creating them and saving to the database is easy",
comments: [{ body: "It's very cool! Thanks a lot!", date: "2014.07.28" }],
hidden: false,
meta: {
votes: 100,
favs: 99
}
};
blogModel.create(doc, function(err, docs){
if(err) console.log(err);
console.log('保存成功:' + docs);
});
Model#save([options], [options.safe], [options.validateBeforeSave], [fn])
var blogEntity = new blogModel({
title: "Mongoose",
author: "L",
body: "Documents are instances of out model. Creating them and saving to the database is easy",
comments: [{ body: "It's very cool! Thanks a lot!", date: "2014.07.28" }],
hidden: false,
meta: {
votes: 100,
favs: 99
}
});
blogEntity.save(function(err, docs){
if(err) console.log(err);
console.log('保存成功:' + docs);
});
Model.create 和Model#save 实现功能一样 ,但是一个是Model直接引用create,一个是将Model 实例化后用save