mongoose api 翻译

作者: 假装正在输入 | 来源:发表于2017-04-15 23:15 被阅读397次

根据自己的渣渣的英语看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 %}

相关文章

网友评论

    本文标题:mongoose api 翻译

    本文链接:https://www.haomeiwen.com/subject/ztvoattx.html