mongoose的内置的主要功能解说


除了定义文档结构和你要存储的数据类型外。模式(Schema)还用于下面定义:

·        Validators
(异步和同步)

·        Defaults -
默认值

·        Getters

·        Setters

·        Indexes -
索引

·        Middleware -
中间件

·        Methods definition -
方法定义

·        Statics definition -
静态定义

·        Plugins -
插件

Aside from defining thestructure of your documents and the types of data you're storing, a Schemahandles the definition of:

·        Validators (async andsync)

·        Defaults

·        Getters

·        Setters

·        Indexes

·        Middleware

·        Methods definition

·        Statics definition

·        Plugins

·        pseudo-JOINs

 

(1)验证器

验证器通过ShcemaType定义

内部使用中间件

默认在使用save操作时自己主动开启(create操作应该是无论用的,这个我们能够试一试)

使用异步操作

验证器能够自己定义

 

 

定义验证通过。path(“属性”).validate(function(value){})来定义,我们看看样例:

<pre name="code" class="javascript">

var toySchema =
new
Schema({

  color: String,

  name: String

});

 

var Toy = mongoose.model('Toy', toySchema);

 

Toy.schema.path('color').validate(function (value) {

  return
/blue|green|white|red|orange|periwinkle/i.test(value);

}, 'Invalid color');

 

var toy = new
Toy({ color:
'grease'});

 

toy.save(function (err) {

  // err is ourValidationError object

  // err.errors.coloris a ValidatorError object

 

 console.log(err.errors.color.message)
// prints'Validator "Invalid color" failed for path color with value `grease`'

 console.log(String(err.errors.color))
// prints'Validator "Invalid color" failed for path color with value `grease`'

 console.log(err.errors.color.type) // prints "Invalid color"

 console.log(err.errors.color.path) // prints "color"

 console.log(err.errors.color.value)
// prints"grease"

  console.log(err.name)
// prints"ValidationError"

  console.log(err.message)
// prints"Validation failed"

});

</pre>

 

上面的样例非常easy嘛。

假设用不到验证的方法那么。直接create 就能够

Toy.create({xx:xxx},function(err,schema){});

 

(2)默认值

 

上样例:

<pre name="code" class="javascript">

var schema =
new Schema({ n: { type: Number, default: })

var M = db.model('M', schema)

var m = new M;

console.log(m.n) // 10

</pre>

 

在方案(Schema)设置defualt值后,值初始化模型后就能够直接获取这个值,那么我们在插入操作中要怎样去做呢?

<pre name="code" class="javascript">

var db = require('mongoose')

,Schema = db.Schema;

var schema = new Schema({ n: { type: Number, default: 10 }});

db.connect('mongodb://localhost:8888/toy', function (err) {

    var Toy = db.model('Toy', schema,"toy");

    new Toy({}).save(function(err){

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

        console.log("报错成功");

    });

    if (err) throw err;

});

</pre>

这个样例中关键的地方在于new Toy({}) 并没有写n这个对象,那么我们来查一下数据库看一下输出:

<pre name="code" class="javascript">

> db.toy.find()

{ "_id" : ObjectId("5361a5fa62c7cc803624ec0d"),"n" : 10, "__v" : 0 }

</pre>

 

 

(3)给模型加入一个静态的方法:

<pre name="code" class="javascript">

// assign afunction to the "statics" object of our animalSchema

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

  this.find({ name:
newRegExp(name, 'i') }, cb);

}

 

var Animal = mongoose.model('Animal',animalSchema);

Animal.findByName('fido',
function (err, animals) {

  console.log(animals);

});

</pre>

 

(4)创建索引:

 

在mongodb数据库中索引排序1 和 -1 代表正反

<pre name="code" class="javascript">

 

var animalSchema=
new
Schema({

  name: String,

  type: String,

  tags: { type: [String], index:
true } // field level

});

 

animalSchema.index({ name: , type: - });
// schema level

</pre>

 

(5)插件就是mongoose提供的一个能够模块化的一个功能,能够把面的一些零散的功能写到一个插件中组合起来,比方set get 方法中间件等写到一个模块中:

 

<pre name="code" class="javascript">

 

// lastMod.js

module.exports = exports =function
lastModifiedPlugin
(schema, options){

  schema.add({ lastMod: Date })

 

  schema.pre('save',
function (next) {

    this.lastMod =
new
Date

    next()

  })

 

  if(options && options.index) {

    schema.path('lastMod').index(options.index)

  }

}

 

// game-schema.js

var lastMod= require('./lastMod');

varGame = new Schema({ ... });

Game.plugin(lastMod, {index:
true });

 

// player-schema.js

varlastMod = require('./lastMod');

varPlayer =
new
Schema({ ... });

Player.plugin(lastMod);

</pre>

 

mongoose 数据库操作2的更多相关文章

  1. mongoose 数据库操作 - 分页

    使用mongoose 加入分页方法,临时还没发现什么更好的方法,我使用的方法是,直接在源代码中加入 找到 node_modules/mongoose/lib/model.js打开这个文件.里面加入这段 ...

  2. mongoose 数据库操作3

    Model.find(query, fields, options, callback) Model.find({ 'some.value': 5 }, function (err, docs) { ...

  3. 转:Mongoose使用操作

    一般我们不直接用MongoDB的函数来操作MongoDB数据库 Mongose就是一套操作MongoDB数据库的接口.   连接数据库 // mongoose 链接var mongoose = req ...

  4. 如何在高并发环境下设计出无锁的数据库操作(Java版本)

    一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...

  5. 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~

    最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...

  6. MySQL 系列(二) 你不知道的数据库操作

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网 ...

  7. ABP创建数据库操作步骤

    1 ABP创建数据库操作步骤 1.1 SimpleTaskSystem.Web项目中的Web.config文件修改数据库配置. <add name="Default" pro ...

  8. 【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  9. django数据库操作和中间件

    数据库配置 django的数据库相关表配置在models.py文件中,数据库的连接相关信息配置在settings.py中 models.py相关相关参数配置 from django.db import ...

随机推荐

  1. html b标签 语法

    html b标签 语法 标签b是什么意思? b的意思是bold,b标签主要用于html中规定粗体文本,该标签内的字符将被设为粗体.B标签所传达的意思只是加粗,没有任何其它的作用. 作用:规定粗体文本. ...

  2. Shell中的特殊字符(三)

    一 通配符 [root@192 test]# touch abc [root@192 test]# touch abcd [root@192 test]# touch 012 [root@192 te ...

  3. docker-compose部署ELK(亲测)

    具体的配置可以参考上面一篇:docker部署ELK 以下是做了一些修改的地方: kibana.yml [root@topcheer config]# cat kibana.yml server.hos ...

  4. docker-compose进行部署容器的时候,报错权限不足

    刚刚用docker-compose部署elk的时候,没有起来,查看日志的时候,发现在数据卷挂载的时候,报错权限不足. 由于日志不在了,这里就直接贴出解决办法. 问题原因及解决办法 原因是CentOS7 ...

  5. 关于win7系统下gitbook的安装与gitbook editor的配合使用

    1.安装nodejs 2.node -v,可查看node版本: npm -v,可查看npm版本 3.npm install gitbook-cli -g,安装gitbook 此过程经常报错,如果报错, ...

  6. CSV文件在Python中的几种处理方式

    Comma Separated Values,简称CSV,它是一种以逗号分隔数值的文件类型.在数据库或电子表格中,它是最常见的导入导出格式,它以一种简单而明了的方式存储和共享数据,CSV文件通常以纯文 ...

  7. java jdk原生的http请求工具类

    package com.base; import java.io.IOException; import java.io.InputStream; import java.io.InputStream ...

  8. sqli--labs(25)

    过滤了 or and 的get注入 0X01测试阶段 ’报错 ” 不报错 那么就是'闭合 好的我们知道闭合后来#闭合后面 ?id= 语法不正确 发现过滤了 or and 那么我们继续构造 ?id= 0 ...

  9. PTA编程总结三

    7-1 抓老鼠啊~亏了还是赚了? (20 分) 某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块 ...

  10. final finalize finally throw throws try catch

    什么是finalize()方法 finalize()方法什么时候被调用 参见网址 析构函数(finalization)的目的是什么 final 和 finalize 的区别 final以下参见网址 f ...