mongoose 笔记,CSS的伪类和伪元素

首先需要安装MongoDB和Node.js。

然后使用npm下载mongoose:

npm install mongoose

接着我们直接在项目中引入mongoose,并且连接数据库就会在本地运行 MongoDB了:

// index.js

var mongoose = require(‘mongoose’);

mongoose.connect(‘mongodb://localhost/demo’);

用node命令执行index.js,demo数据库就会在本地运行了。我们需要在连接数据库成功或者失败的时候有些提示,可以这样添加代码:

var db = mongoose.connection;

db.on(‘error’, console.error.bind(console, ‘connection error:’));

db.once(‘open’, function (callback) {

// 后续代码默认都写在这里!

});

连接成功的时候就会执行一次回调函数,现在假设下面所有代码都是在成功的回调函数中的。

在Mongoose中,所有东西都是衍生自Schema。 Schema(模式)就像是Model(模型)的抽象类一样的存在,创建一个Schema:

var mySchema =new mongoose.Schema({

name: String

});

我们创建了一个叫mySchema的Schema,并且定义了一个属性name,限定类型是String。接着可以用mySchema创建一个Model:

var MyModel = mongoose.model(‘MyModel’, mySchema);

这样就按照mySchema创建了一个MyModel模型,这个MyModel其实充当了两个作用:

充当MongoDB中的collection(集合)

是用来构造document(文档)的类

所以要构造一条document只要:

var instance = new MyModel({ name: ’ Instance’ })

console.log( instance.name) // ‘instance’

instance就是一条也可以称作Document了。

如此看来Schema、Model和Document的关系就像是抽象类、实现类和实例三者的关系一样。所以嘛,自然可以在Schema定义后添加方法:

var mySchema =new mongoose.Schema({

name: String

});

mySchema.methods.getName=function(){

console.log(this.name + “来自getName方法”);

}

instance.getName();//‘instance来自getName方法’

instance实例现在还没有被保存在MongoDB中,所有的实例都要调用save方法后才会保存进数库:

instance.save((err,instance)=>{

if (err) return console.error(err);

instance.getName();

})

而后,需要查询数据时就需要使用Model,因为Model的作用时充当MongoDB中的collection(集合),所以这样查询数据:

MyModel.find(function (err, instances) {

if (err) return console.error(err);

console.log(instances);

});

当然了,也可以加条件查询:

MyModel.find({name:“instance”},callback);

这样就是一个完整的使用mongoose插入和查询数据的操作了。完整代码如下:

var mongoose = require(‘mongoose’);

var db = mongoose.connection;

db.on(‘error’, console.error.bind(console, ‘connection error:’));

db.once(‘open’, function(callback) {

var mySchema =new mongoose.Schema({

name: String

});

mySchema.methods.getName = function() {

console.log(this.name + “来自getName方法”);

}

var MyModel = mongoose.model(‘MyModel’, mySchema);

var instance = new MyModel({ name: ’ Instance’ })

console.log(instance.name) // ‘instance’

instance.getName(); //‘instance’

instance.save((err, instance) => {

if (err) {

return console.error(err)

};

instance.getName();

})

});

mongoose.connect(‘mongodb://localhost/test’);

Schemas

定义schema

Mongoose所有的一切始于Schema。每一个Schema都映射到MongoDB中的collection(集合)和定义了document(文档)的结构。

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

}

});

如果想要在创建Schema以后添加额外的key,可以使用Schema的add方法。

现在只需要知道SchemaTypes有:

String

Number

Date

Buffer

Boolean

Mixed

ObjectId

Array

创建了Schema后肯定就是创建Model了,然而,在这之间我们还可以定义instance方法、定义静态Model方法、定义索引和使用生命周期挂钩(中间件)

instance方法

instance方法使用schema的methods添加,这样做可以让创建的documents在save之前执行一些自定义的操作:

// define a schema

var animalSchema = new Schema({ name: String, type: String });

// assign a function to the “methods” object of our animalSchema

animalSchema.methods.findSimilarTypes = function (cb) {

return this.model(‘Animal’).find({ type: this.type }, cb);

}

//define a model

var Animal = mongoose.model(‘Animal’, animalSchema);

//instance

var dog = new Animal({ type: ‘dog’ });

dog.findSimilarTypes(function (err, dogs) {

console.log(dogs); // woof

});

这样做要注意的是不要重写mongoose原来的document方法,不然会有未知错误。

静态Model方法

在methods上添加的是给document用的,而在statics上添加的方法就是给Model用的:

// assign a function to the “statics” object of our animalSchema

animalSchema.statics.findByName = function (name, cb) {

this.find({ name: new RegExp(name, ‘i’) }, cb);

}

var Animal = mongoose.model(‘Animal’, animalSchema);

Animal.findByName(‘fido’, function (err, animals) {

console.log(animals);

});

索引

MongoDB支持使用索引。在mongoose中,分别可以在内部和外部定义,不过复合索引就只能在外部定义了:

var animalSchema = new Schema({

name: String,

type: String,

tags: { type: [String], index: true } // 内部

});

animalSchema.index({ name: 1, type: -1 }); // 外部,复合索引

当应用启动,Mongoose就会自动调用ensureIndex为每个schema创建索引。索引创建会有显著的性能影响,所以建议在生产环境中禁用:

animalSchema.set(‘autoIndex’, false);

// or

new Schema({…}, { autoIndex: false });

虚拟属性

虚拟属性是一种不会存储进数据库但是存在在doucment中的属性。充当getter和setter的功能。

基本代码:

var personSchema = new Schema({

name: {

first: String,

last: String

}

});

// compile our model

var Person = mongoose.model(‘Person’, personSchema);

// create a document

var bad = new Person({

name: { first: ‘Walter’, last: ‘White’ }

});

当调用toObject和toJSON方法时默认都是不会有虚拟属性的。

现在想访问bad.name.full就给出全名,就要使用虚拟属性的getter功能:

personSchema.virtual(‘name.full’).get(function () {

return this.name.first + ’ ’ + this.name.last;

});

。。。

console.log(‘%s is insane’, bad.name.full); // Walter White is insane

同样的有setter功能:

personSchema.virtual(‘name.full’).set(function (name) {

var split = name.split(’ ');

this.name.first = split[0];

this.name.last = split[1];

});

bad.name.full = ‘Breaking Bad’;

console.log(bad.name.first); // Breaking

console.log(bad.name.last); // Bad

options

Schemas在构建实例或者通过set方法可以进行有options的配置:

new Schema({…}, options);

// 或者

var schema = new Schema({…});

schema.set(option, value);

options:

autoIndex:自动索引

capped

collection

id

_id

read

safe

shardKey

strict

toJSON

toObject

versionKey

autoIndex

在应用启动时,Mongoose会调用ensureIndex为Schema构建索引。自Mongoose v3起,索引默认都会在后台创建。如果想关闭自动创建或者以后手动创建索引,可以进行如下设置:

var schema = new Schema({…}, { autoIndex: false });

var Clock = mongoose.model(‘Clock’, schema);

Clock.ensureIndexes(callback);

bufferCommands
capped

Mongoose支持MongoDB的固定大小集合,直接设置capped表示最大空间,单位时bytes,当然也可以使用对象设置max(最大document数)和autoIndexId:

new Schema({…}, { capped: 1024 });

//或者

new Schema({…}, { capped: { size: 1024, max: 1000, autoIndexId: true } });

collection

Mongoose中collection的名字默认时注册Model时的名字,如果想要自定义,可以这样设置:

var dataSchema = new Schema({…}, { collection: ‘data’ });

id

document都会设置一个虚拟属性id并配置getter来获取_id,如果不想要id虚拟属性可以设为false:

// default behavior

var schema = new Schema({ name: String });

var Page = mongoose.model(‘Page’, schema);

var p = new Page({ name: ‘mongodb.org’ });

console.log(p.id); // ‘50341373e894ad16347efe01’

// disabled 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

Mongoose默认会在生成document的时候生成_id字段,如果想禁止这个行为可以设为false,但是插入数据库的时候仍然会有_id字段:

// default behavior

var schema = new Schema({ name: String });

var Page = mongoose.model(‘Page’, schema);

var p = new Page({ name: ‘mongodb.org’ });

console.log§; // { _id: ‘50341373e894ad16347efe01’, name: ‘mongodb.org’ }

// disabled _id

var schema = new Schema({ name: String }, { _id: false });

// 不要使用schema.set(“_id”,false),

var Page = mongoose.model(‘Page’, schema);

var p = new Page({ name: ‘mongodb.org’ });

console.log§; // { 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’ }

})

})

read

设置读写分离属性:

var schema = new Schema({…}, { read: ‘primary’ }); // also aliased as ‘p’

var schema = new Schema({…}, { read: ‘primaryPreferred’ }); // aliased as ‘pp’

var schema = new Schema({…}, { read: ‘secondary’ }); // aliased as ‘s’

var schema = new Schema({…}, { read: ‘secondaryPreferred’ }); // aliased as ‘sp’

var schema = new Schema({…}, { read: ‘nearest’ }); // aliased as ‘n’

safe
shardKey
strict

mongoose默认会开启严格模式,所有不是在Schema定义的属性都不会被保存进数据库,将strict设为false就会:

var thingSchema = new Schema({…})

var Thing = mongoose.model(‘Thing’, thingSchema);

var thing = new Thing({ iAmNotInTheSchema: true });

thing.save(); // iAmNotInTheSchema不会保存进数据库

// 设为 false…

var thingSchema = new Schema({…}, { strict: false });

var thing = new Thing({ iAmNotInTheSchema: true });

thing.save(); // iAmNotInTheSchema会保存进数据库

还支持在instance的时候设置:

var thing = new Thing(doc, false); // 关闭严格模式

除了boolean,也可以设置为throw,但是这样会抛出错误,而不时忽略值。

提示:不要手贱设为false

提示:在mongoose v2 默认只时false

提示:直接在document上set的只都不会被保存

var thingSchema = new Schema({…})

var Thing = mongoose.model(‘Thing’, thingSchema);

var thing = new Thing({},false);

thing.iAmNotInTheSchema = true;

thing.save(); // iAmNotInTheSchema is never saved to the db

toJSON和toObject

两个方法类似,都是输出格式化对象:

var schema = new Schema({ name: String });

schema.path(‘name’).get(function (v) {

return v + ’ is my name’;

});

//默认是不使用getter和不输出virtual

schema.set(‘toJSON’, { getters: true, virtuals: false });

var M = mongoose.model(‘Person’, schema);

var m = new M({ name: ‘Max Headroom’ });

console.log(m.toObject()); // { _id: 504e0cd7dd992d9be2f20b6f, name: ‘Max Headroom’ }

console.log(m.toJSON()); // { _id: 504e0cd7dd992d9be2f20b6f, name: ‘Max Headroom is my name’ }

// stringify内部会调用toJSON

console.log(JSON.stringify(m));

//console内部时调用toObject

console.log(m);

versionKey

设置document的version键,默认键是_v,设为false的话就没有这个version:

var schema = new Schema({ name: ‘string’ });

var Thing = mongoose.model(‘Thing’, schema);

var thing = new Thing({ name: ‘mongoose v3’ });

thing.save(); // { __v: 0, name: ‘mongoose v3’ }

// 换 versionKey

new Schema({…}, { versionKey: ‘_somethingElse’ })

var Thing = mongoose.model(‘Thing’, schema);

var thing = new Thing({ name: ‘mongoose v3’ });

thing.save(); // { _somethingElse: 0, name: ‘mongoose v3’ }

//设为false

new Schema({…}, { versionKey: false });

var Thing = mongoose.model(‘Thing’, schema);

var thing = new Thing({ name: ‘no versioning please’ });

thing.save(); // { name: ‘no versioning please’ }

Models

Models在Schema和document中作承上启下,作用有两个:

  • 充当MongoDB中的collection(集合)

  • 是用来构造document(文档)的类

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

最后

总的来说,面试官要是考察思路就会从你实际做过的项目入手,考察你实际编码能力,就会让你在电脑敲代码,看你用什么编辑器、插件、编码习惯等。所以我们在回答面试官问题时,有一个清晰的逻辑思路,清楚知道自己在和面试官说项目说技术时的话就好了

chema);

var thing = new Thing({ name: ‘no versioning please’ });

thing.save(); // { name: ‘no versioning please’ }

Models

Models在Schema和document中作承上启下,作用有两个:

  • 充当MongoDB中的collection(集合)

  • 是用来构造document(文档)的类

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-SVoxryrh-1710687570382)]
[外链图片转存中…(img-MPJQBs01-1710687570382)]
[外链图片转存中…(img-iLPSsFJ4-1710687570383)]
[外链图片转存中…(img-u2I7KRTw-1710687570384)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-0memDpGL-1710687570384)]

最后

总的来说,面试官要是考察思路就会从你实际做过的项目入手,考察你实际编码能力,就会让你在电脑敲代码,看你用什么编辑器、插件、编码习惯等。所以我们在回答面试官问题时,有一个清晰的逻辑思路,清楚知道自己在和面试官说项目说技术时的话就好了

[外链图片转存中…(img-7I4DHL7m-1710687570384)]

[外链图片转存中…(img-LgiJYQlD-1710687570385)]

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值