我们先来上一个直观的例子吧:
第一次使用 mongoose
// 目录结构
-model
-db.js // 链接数据库
-test1.js // 定义模型
- app.js
- package.json
安装mongoose
cnpm install mongoose --save
// db.js
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test'); // 链接test数据库
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:')); // 连接失败
// 连接成功
db.on('open', function(){
console.log('链接成功!!');
})
module.exports = db; // 导出
// test1.js
var mongoose = require('mongoose')
var db = require('./db.js') // 引入数据库连接文件
// 创建 TestSchema
var TestSchema = new mongoose.Schema({
name: { type: String },
age: { type: Number, default: 0 },
email: { type: String },
time: { type: Date, default: Date.now }
});
//建立模型
var TestModel = db.model("test1", TestSchema);
// 导出模型
module.exports = TestModel;
// app.js
var db = require("./model/db.js");
var TestModel = require('./model/test1.js');
// 实例化一个模型
var TestEntity = new TestModel({
name: "zjj",
age: 28,
email: "helloworld@qq.com"
});
// 调用本身mongoose 自带的实例打方法 save() 存到数据库中
TestEntity.save(function (error, doc) {
if (error) {
console.log("error :" + error);
} else {
console.log(doc);
// 打印出存入的内容
}
});
mongoose是nodeJS提供连接 mongodb的一个库!
连接mongoose
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test');
const con = mongoose.connection;
con.on('error', console.error.bind(console, '连接数据库失败'));
con.once('open',()=>{
//成功连接
})
在mongoose 中大致有这么几个概念:
- Schema: 相当于一个数据库的模板. Model可以通过mongoose.model 集成其基本属性内容. 当然也可以选择不继承.
- Model: 基本文档数据的父类,通过集成Schema定义的基本方法和属性得到相关的内容.
- instance: 这就是实实在在的数据了. 通过 new Model()初始化得到.
她们各自之间的关系是什么呢?
首先我们来先学习 Schema
schemas
定义你的schema
mongoose
一切源于 一个schema
. 每一个 schema
映射到 MongoDB
的集合和定义该结合中的文档形式。
var mongoose = require('mongoose');
var Schema = mongoose.Schema();
// new 一个 Schema 得到 blogSchema
var blogSchema = new Shema({
title: String,
author: String,
body: String,
comments: [{body: String, date: Date}],
hidden: Boolean,
meta: {
votes: Number,
favs: Number
}
});
我们代码中的每一个 key 定义了我们文档中的每一个属性,该属性将转换为其关联的 SchemaType
。
SchemaType :
- String
- Number
- Date
- Buffer
- Boolean
- Mixed
- ObjectId
- Array
SchemaTypes实例
// 一个schema实例
var TestSchema = new mongoose.Schema({
name: String,
binary: Buffer,
living: Boolean,
updated: { type: Date, default: Date.now },
age: { type: Number, min: 18, max: 65 },
mixed: Schema.Types.Mixed,
_someId: Schema.Types.ObjectId,
array: [],
ofString: [String],
ofNumber: [Number],
ofDates: [Date],
ofBuffer: [Buffer],
ofBoolean: [Boolean],
ofMixed: [Schema.Types.Mixed],
ofObjectId: [Schema.Types.ObjectId],
nested: { // 对象中包含对象
stuff: { type: String, lowercase: true, trim: true }
}
});
// 使用实例
var TestEntity = new TestModel({
name: 'zjj',
age: 45,
updated: new Date(),
binary : new Buffer(0),
living: false,
mixed: { any: { thing: 'i want', assd:'sada' } },
_someId: new mongoose.Types.ObjectId,
array: [1,2,3],
ofString: ['sad','sada'],
ofNumber: [1,2,3,4,5,],
ofDates: [new Date,new Date(2017/4/23)],
ofMixed: [1,'sad',{sda:'dsada'}],
ofBoolean: [true, false, true],
nested: {
stuff: 'dsad'
},
ofBuffer: [new Buffer(0)]
});
// 储存结果是
/* 7 */
{
"_id" : ObjectId("5abb529645f6673964cc54f5"),
"nested" : {
"stuff" : "dsad"
},
"array" : [
1,
2,
3
],
"ofString" : [
"sad",
"sada"
],
"ofNumber" : [
1,
2,
3,
4,
5
],
"ofDates" : [
ISODate("2018-03-28T08:30:14.252Z"),
ISODate("1970-01-01T00:00:00.021Z")
],
"ofBuffer" : [
{ "$binary" : "", "$type" : "00" }
],
"ofBoolean" : [
true,
false,
true
],
"ofMixed" : [
1,
"sad",
{
"sda" : "dsada"
}
],
"ofObjectId" : [],
"name" : "zjj",
"age" : 45,
"updated" : ISODate("2018-03-28T08:30:14.252Z"),
"binary" : { "$binary" : "", "$type" : "00" },
"living" : false,
"mixed" : {
"any" : {
"thing" : "i want",
"assd" : "sada"
}
},
"_someId" : ObjectId("5abb529645f6673964cc54f4"),
"__v" : 0
}
我们来看一下几个比较重要的类型:
Date
使用内置的Date 日期类型时,如果你在文档中使用 Date
内置的 setMonth
之类的方法来修改它,那么mongoose 是不会意识到它的改变的。你必须使用 doc.markModified
方法来告诉mongoose 这个改变。
var Assignment = mongoose.model('Assignment', { dueDate: Date });
Assignment.findOne(function (err, doc) {
doc.dueDate.setMonth(3);
doc.save(callback); // 设置月份没有效果
doc.markModified('dueDate'); //告诉 mongoose 需要修改 dueDate
doc.save(callback); // works
});
Mixed
混合型是一种存啥都行的类型,Mixed 类型用户 Schema.Types.Mixed 或者是一个字面上的对象 {} 来定义。
// 这两种是等价的定义方式
var Any = new Schema({ any: {} });
var Any = new Schema({ any: Schema.Types.Mixed });
// Schema 类型定义
Mixed类型在修改时时候必须使用 doc.markModified
方法来告诉mongoose某个混合类型的值被改变了。
person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // 这样才能储存成功
ObjectId
用Schema.Types.ObjectId 来声明一个对象id类型。
var mongoose = require('mongoose');
var ObjectId = mongoose.Schema.Types.ObjectId;
// Schema 类型定义
var Car = new Schema({ driver: ObjectId });
数组类型
数组内部可以是各种类型
var TestSchema = new mongoose.Schema({
array: [],
ofString: [String],
ofNumber: [Number],
ofDates: [Date],
ofBuffer: [Buffer],
ofBoolean: [Boolean],
ofMixed: [Schema.Types.Mixed],
ofObjectId: [Schema.Types.ObjectId]
});
// 储存
array: [1,2,3,'dasda'],
ofString: ['sad','sada'],
ofNumber: [1,2,3,4,5,],
ofDates: [new Date,new Date(2017/4/23)],
ofMixed: [1,'sad',{sda:'dsada'}],
ofBoolean: [true, false, true]
自定义的模式类型
除了上面的几种数据类型之外,还可以自己定义自己的模式类型
这里就先不总结了,需要时查看文档即可了。
Schema 暂时为止
未完待续, 下一篇将会认识 Models
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。