根据自己的渣渣的英语看mongose文档整理
引用与连接数据库
{% codeblock %}
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/page');
{% endcodeblock %}
目前我们已经连接了一运行在本地的数据库,并且创建了一个test数据库,接下来我们需要知道我们的数据库是否连接成功,一旦连接成功会执行回调,所有的操作都在回调中完成。
{% codeblock %}
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function (callback) {
console.log('数据库连接成功')
});
{% endcodeblock %}
schema
在mongoose中,所有事情都源自于模式(schema)
{% codeblock %}
// 1.先定义一个模式
// 2.在模式中增加方法,且必须在定义模型前面增加(静态方法与实例化方法)
// 3.在定义一个模型
// 4.实例化模型
var testSchema = new mongoose.Schema({
id:Number,
content:String,
date:Date,
arr:Array,
obj:Object
})
// 添加实例化方法
testSchema.methods.getContent_methods = function () {
var test = this.content
? "testSchema getContent_methods is " + this.content
: "I don't have a getContent_methods"
console.log(test);
}
// 添加静态方法
testSchema.statics.getContent_statics = function () {
var test = this.content
? "testSchema getContent_statics method is " + this.content
: "I don't have a getContent_statics method"
console.log(test);
}
var TestModel = mongoose.model('test',testSchema);
{% endcodeblock %}
一个模型就是我们构造的一个文档,在上面的这个例子中,每个文档都将带有test的属性与我们在模式中声明的行为
接下来实例化一个文档
{% codeblock %}
var test = new TestModel({
id:123,
content:'content',
date:new Date(),
arr:[1,2,3],
obj:{
firstName:'zheng',
lastName:'chong'
}
})
// 调用实例化方法
test.getContent_methods() // "testSchema getContent_methods method is content"
// 调用静态方法
TestModel.getContent_statics() // "testSchema getContent_statics method is content"
{% endcodeblock %}
索引
mongodb支持2级索引,当创建符合索引的时候更是必须的
{% codeblock %}
var animalSchema = new Schema({
name: String,
type: String,
tags: { type: [String], index: true }
});
{% endcodeblock %}
Virtuals
虚拟属性能设置和取得文档的属性但是不能持久化到mongodb中,对于格式化和结合字段是非常的有用的,同时用于设置单个值存储到多个值。
{% codeblock %}
// 定义模式
var personSchema = new Schema({
name: {
first: String,
last: String
}
});
// 定义模型
var Person = mongoose.model('Person', personSchema);
// 实例化文档
var bad = new Person({
name: { first: 'zheng', last: 'chong' }
});
console.log(bad.name.first + ' ' + bad.name.last); // <<< zheng chong
// 或者可以用一下方法定义
personSchema.virtual('name.full').get(function () {
return this.name.first + ' ' + this.name.last;
});
console.log('%s is insane', bad.name.full); // <<< zheng chong is insane
// mongoose 也可以通过设置虚拟属性
personSchema.virtual('name.full').set(function (name) {
var split = name.split(' ');
this.name.first = split[0];
this.name.last = split[1];
});
mad.name.full = 'zheng chong';
console.log(mad.name.first); // <<< zheng
console.log(mad.name.last); // <<< chong
{% endcodeblock %}
配置属性(options)
模式可配置一些选项,可以直接传递给构造函数或者调用set进行设置:
{% codeblock %}
new Schema({..}, options);
// 或者
var schema = new Schema({..});
schema.set(option, value);
{% endcodeblock %}
option: autoIndex
在应用程序启动时,mongoose发送ensureIndex命令来声明的每个索引。mongoosev3,默认在后台创建索引。如果你想禁用自动创建功能,手动处理在创建索引时,设置模式自动索引选项为false和使用ensureIndexes方法模型。
{% codeblock %}
var schema = new Schema({..}, { autoIndex: false });
var Clock = mongoose.model('Clock', schema);
Clock.ensureIndexes(callback);
{% endcodeblock %}
option: bufferCommands
缓冲区命令
option: capped
设置集合上限
option: collection
配置集合名字
option: id/_id
mongodb默认为每一个文档配置一个_id,如果不想要这个默认id可以将设置为false
{% codeblock %}
// id
// 默认
var schema = new Schema({ name: String });
var Page = mongoose.model('Page', schema);
var p = new Page({ name: 'mongodb.org' });
console.log(p.id); // '50341373e894ad16347efe01'
// 禁掉id
var schema = new Schema({ name: String }, { id: false });
var Page = mongoose.model('Page', schema);
var p = new Page({ name: 'mongodb.org' });
console.log(p.id); // undefined
// ---------------------分割线--------------------
// _id
// 默认
var schema = new Schema({ name: String });
var Page = mongoose.model('Page', schema);
var p = new Page({ name: 'mongodb.org' });
console.log(p); // { _id: '50341373e894ad16347efe01', name: 'mongodb.org' }
// 禁掉 _id
var schema = new Schema({ name: String }, { _id: false });
// 假设不设置 _id 为false之后
// var schema = new Schema({ name: String });
// schema.set('_id', false);
var Page = mongoose.model('Page', schema);
var p = new Page({ name: 'mongodb.org' });
console.log(p); // { name: 'mongodb.org' }
// 当保存的时候MongoDB会自动创建一个_id
p.save(function (err) {
if (err) return handleError(err);
Page.findById(p, function (err, doc) {
if (err) return handleError(err);
console.log(doc); // { name: 'mongodb.org', _id: '50341373e894ad16347efe12' }
})
})
{% endcodeblock %}
SchemaTypes
{% codeblock %}
var schema = new 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 }
}
// test
var Thing = mongoose.model('Thing', schema);
var m = new Thing;
m.name = 'Statue of Liberty'
m.age = 125;
m.updated = new Date;
m.binary = new Buffer(0);
m.living = false;
m.mixed = { any: { thing: 'i want' } };
m.markModified('mixed');
m._someId = new mongoose.Types.ObjectId;
m.array.push(1);
m.ofString.push("strings!");
m.ofNumber.unshift(1,2,3,4);
m.ofDate.addToSet(new Date);
m.ofBuffer.pop();
m.ofMixed = [1, [], 'three', { four: 5 }];
m.nested.stuff = 'good';
m.save(callback);
{% endcodeblock %}
部分api
{% codeblock %}
var testSchema = new mongoose.Schema({
id:Number,
content:String,
date:Date,
arr:Array,
obj:Object
})
var TestModel = mongoose.model('test',testSchema);
// var id = 1234;
var test = new TestModel({
id:Math.random(),
content:'test',
date:new Date(),
arr:['a','b'],
obj:{
testObj:{
content:'content'
},
testobj2:'testobj2'
}
})
{% endcodeblock %}
/*****************************
- 查找
*****************************/
{% codeblock %}
// 返回的是更新前的数据
TestModel.findByIdAndUpdate({_id:'58cd528c5786f614e4710072'},{$set:{content:'123aaaa456'}},function (err,result) {
if(err) throw err;
console.log(result)
})
{% endcodeblock %}
/****************************
- 嵌套模型 —————— 子文档
****************************/
// 子模型
var childSchema = new mongoose.Schema({ name:String });
// // 父模型
// * 子文档是父文档的一个数组
// 子文档有所有与父文档相同的方法,唯一的区别是他们不是单独保存,只有最高级的父文档保存的时候才被保存
{% codeblock %}
var parentSchema = new mongoose.Schema({
children: [childSchema],
content:String,
obj:Object,
first:String,
last:String,
occupation:Number,
name:Object
})
var Parent = mongoose.model('parent',parentSchema);
var parent = new Parent();
var parent = new Parent({
children:[{name:'childs_1'},{name:'childs_2'}],
content:'content1',
obj:{
content:{
string:'string'
},
string:'string'
},
first:'first1',
last:'last1',
occupation:'123213324',
name:{
first:'zheng',
last:'chong'
},
age:'12'
});
parent.children[0].name = 'Matthew';
parent.save(function (err,result) {
if(err) throw err;
console.log(result)
})
{% endcodeblock %}
/***************************
- 查找子文档
****************************/
// 每个子文档都有_id 文档嵌套都有个特别方法,通过该_id 来寻找这个文档
// var doc = parent.children.id('58cd5e4aa8b2d905345258b7');
// console.log(doc) // 该方法验证不了
/**
- 增加子文档的方法 比如 push / unshift / addToSet
*/
// ?这个方法在只有开启执行 parent.save()的时候才会生效
{% codeblock %}
console.log('<<<<<<<-------------->>>>')
parent.children.push({name:'addDocParentaaa'});
var subdoc = parent.children[0];
console.log(subdoc)
console.log(subdoc.isNew) //>>>>> true
-- 保存
parent.save(function (err,data) {
if( err ) throw err;
console.log(data)
})
console.log('<<<<<<<-------------->>>>')
// * 子文档也可以通过create方法来创建而不用通过增加他们到数组
var newdoc = parent.children.create({ name: 'Aaron' });
console.log(newdoc) // >>> 如何保存他们
parent.save(function (err,result) {
if(err) throw err;
console.log(result)
})
console.log('<<<<<<<-------------->>>>')
{% endcodeblock %}
/********************************************
-
删除文档
-
每个子文档都好他们自己删除的方法 method remove
****************************/
{% codeblock %}
var rmdoc = parent.children.id('58cd66342a0b9909e42e6360');
console.log(rmdoc)
parent.save(function (err,data) {
if(err) throw err;
console.log(data)
})
{% endcodeblock %}
/********************************************
- 查询语句
*************************************************/
// 过滤多余的字段,只要name跟occupation跟content字段
Parent.findOne({'name.last':'chong'},'name occupation content').exec(function (err,result) {
if(err) throw err;
console.log('<<<------------>>>')
// console.log(result)
})
// 找到第一个满足条件的时候就返回结果
{% codeblock %}
Parent.findOne({'name.last':'chong'}).exec(function (err,result) {
if(err) throw err;
console.log('<<<------------>>>')
// console.log(result)
})
// 找到所有满足条件的结果返回
Parent.find({'name.last':'chong'}).exec(function (err,result) {
if(err) throw err;
// console.log(result)
console.log('<<<------------>>>')
})
var query = Parent.find({'content':'content'});
query.select('name occupation');
query.exec(function (err,result) {
if(err) throw err;
// console.log(result)
console.log('<<<------------>>>')
})
var query_A = Parent.find({content:/content1/})
query_A
// .limit(3)
.where('occupation').gt(123456)
.select('name content occupation')
.exec(function (err,data) {
if(err) throw err;
// console.log(data)
})
{% endcodeblock %}
/******************************************
-
校验
-
每个错误校验都有提供type/ path / value 属性
******************************************/
{% codeblock %}
var toySchema = new mongoose.Schema({
name:String,
color:String
})
var Toy = mongoose.model('toy',toySchema);
// 该方法会把在存储的时候过滤值,没有通过校验的值是无法保存
Toy.schema.path('color').validate(function (value) {
return /blue|green|white|red|orange/i.test(value);
},'Invalid color');
var toy = new Toy({
name:'color',
color:'blue'
})
toy.save(function (err,data) {
// 过滤校验之后文档同样具有一个错误的属性
// toy.errors.color.message === err.errors.color.message
if(err) console.error(err.errors.color);
// console.log(data)
})
{% endcodeblock %}
/******************************************
-
中间件
-
中间件事执行在文档层面(document leve)的不是执行在model层面(Model level)的
var schema = new Schema(..);
schema.pre('save', function (next) {
// do stuff
next();
});
- 错误处理中间件
schema.pre('save', function (next) {
var err = new Error('something went wrong');
next(err);
});
// later...
myDoc.save(function (err) {
console.log(err.message) // something went wrong
});
*****************************************/
/**
- population
*/
{% codeblock %}
var Schema = mongoose.Schema
var personSchema = Schema({
_id : Number,
name : String,
age : Number,
stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }]
});
var storySchema = Schema({
_creator : { type: Number, ref: 'Person' },
title : String,
fans : [{ type: Number, ref: 'Person' }]
});
var Story = mongoose.model('Story', storySchema);
var Person = mongoose.model('Person', personSchema);
var aaron = new Person({ _id: 0, name: 'Aaron', age: 100 });
aaron.save(function (err) {
if (err) console.error( err );
var story1 = new Story({
title: "Once upon a timex.",
_creator: aaron._id // assign the _id from the person
});
story1.save(function (err) {
if (err) return false;
// thats it!
})
})
Story.find({})
// .populate('_creator')
.populate({
path: 'fans',
match: { age: { $gte: 21 }},
select: 'name -_id',
options: { limit: 1 }
})
.exec(function (err,result) {
if(err) console.log(err);
console.log(result)
})
{% endcodeblock %}
网友评论