之见到我写点啥简直是奇迹,由于现在喜欢上玩转node.js +mongoose,个人爱好,靠近前端的又是英文文档,苦逼得很,悟出来一个写一个吧。之前喜欢误打误撞,网上搜索一点解决一下问题,后来实在难看得很,为啥,解决一个小问题又来大问题,刚解决完大问题,有来巨大的bug,所有必需系统的学习,就算爱折腾也得有点头绪,决定先认真看完文档再说吧,免得想开发点啥都折腾得没有兴趣了……。

首先我们得知道Schema常用的有哪些数据类型,不能只知道需要一个见一个就用一个,这样会感觉一直在摸索中探寻,不能把握全局。

Schema.Types

  • String  字符串
  • Number 数字,什么int啊,float啊,double啊,都只有这个Number就哦了
  • Boolean | Bool
  • Array 数组
  • Buffer 二进制
  • Date 日期
  • ObjectId | Oid mongodb主键一般都是用{_id:Schema.Types.objectId}
  • Mixed 这个强大,混合型的,也就是当你不确定这个属性存什么的时候设置为它吧,如果在被确立类型赋值后,需要用到一个函数来通知修改这个类型。下文会讲到。
    如何定义使用呢,请往下看:
    var mongoose = require('mongoose');
    var ObjectId = mongoose.Schema.Types.ObjectId;

    当然可以简略使用,请看如下定义

//定义children的子嵌套
var child = new Schema({ name: String });
//添加字段方式1
var schema = new Schema({ name: String, age: Number, children: [child]});
//添加字段方式2
//var schema = new Schema;
// schema.add({name :String, age: Number, children: [child] }); var Tree = mongoose.model('Tree', schema);
// 设置 schema 选项
new Schema({ name: String }, { _id: false, autoIndex: false })

重点讲的就是,我们在定义嵌套文档是一般都不需要自动生成的_id,和索引对不?我们只要在Schema的第二个参数里设置下即可:
    _id:false或者_id:0,禁止自动生成主键
    autoIndex:false 或者autoIndex:0 禁止自动创建索引
    对了 false可以用数字0表示,true嘛你懂的。还有跟多的选项供你按需使用。一大串。

Options: 其他可选项

  • autoIndex: bool - 默认 true
  • bufferCommands: bool - 默认 true
  • capped: bool - 默认 false
  • collection: string - 无
  • id: bool - 默认 true
  • _id: bool - 默认 true
  • minimize: bool - controls document#toObject behavior when called manually - 默认 true
  • read: string
  • safe: bool - 默认 true.
  • shardKey: bool - 默认 null
  • strict: bool - 默认 true
  • toJSON - object - 无
  • toObject - object - 无
  • versionKey: bool - 默认 "__v" 这玩意儿有些讨厌,会自动在数据库里生成这个字段,最好禁用。

Schema#method(method, [fn])

这个method方法很不错,当我们增删查改完想返回必要数据是可以交给此方法来做。如果一个方法的时候在method第一个参数设定方法名字符串,第二个参数为回调函数,如下:

var schema = kittySchema = new Schema(..);

schema.method('meow', function () {
console.log('meeeeeoooooooooooow');
}) var Kitty = mongoose.model('Kitty', schema); var fizz = new Kitty;
fizz.meow(); // meeeeeooooooooooooow

如果多个方法的时候,可以同时绑定,如下来使用。当然你也可以一个一个的如上面的列子来写。

schema.method({
purr: function () {}
, scratch: function () {}
}); // later
fizz.purr();
fizz.scratch();

Schema#path(path, constructor)

这个path方法用于修改属性的类型,原来已经定义好的属性name的Schema类型为String,要改成Number就这样使用。

schema.path('name', Number) //修改name的数据类型

如果要获取这个属性的数据类型,使用

schema.path('name') // 返回一个 Schema的类型

Schema#post(method, fn)

对于这个方法,用处在于把自定义的处理方法添加到event  emitter事件循环上去,给shema注册事件并能接收model处理后返回的文档,使用model实例来调用。

var schema = new Schema(..);
schema.post('save', function (doc) {
console.log('this fired after a document was saved');
}); var Model = mongoose.model('Model', schema); var m = new Model(..);
m.save(function (err) {
console.log('this fires after the `post` hook');
});

Schema#static(name, fn)

注册静态方法,用实例直接调用,不需要再new一下了

var schema = new Schema(..);
schema.static('findByName', function (name, callback) {
return this.find({ name: name }, callback);
}); var Drink = mongoose.model('Drink', schema);
Drink.findByName('sanpellegrino', function (err, drinks) {
//
});

[转] mongoose 之Shema的更多相关文章

  1. Nodejs之MEAN栈开发(三)---- 使用Mongoose创建模型及API

    继续开扒我们的MEAN栈开发之路,前面两节我们学习了Express.Jade引擎并创建了几个静态页面,最后通过Heroku部署了应用. Nodejs之MEAN栈开发(一)---- 路由与控制器 Nod ...

  2. mongoose 建立schema 和model

    在node中使用MongoDB很多情况下,都是使用mongoose的,所以这集来介绍一下 安装 yarn add mongoose 连接 const mongoose = require(" ...

  3. mongoose - 让node.js高效操作mongodb

    Mongoose库简而言之就是在node环境中操作MongoDB数据库的一种便捷的封装,一种对象模型工具,类似ORM,Mongoose将数据库中的数据转换为JavaScript对象以供你在应用中使用. ...

  4. 在mongoose中使用$match对id失效的解决方法

    Topic.aggregate( //{$match:{_id:"5576b59e192868d01f75486c"}}, //not work //{$match:{title: ...

  5. Mongo基础使用,以及在Express项目中使用Mongoose

    MongoDB的基本使用 MongoDB特点: 使用BSON存储数据 支持相对丰富的查询操作(相对其他nosql数据库) 支持索引 副本集(支持多个实例/多个服务器运行同个数据库) 分片(数据库水平扩 ...

  6. mongoose数据库连接和操作

    var mongoose = require('mongoose') mongoose.connect('mongodb://localhost:27017/hometown'); var db = ...

  7. mongoose 和 mongoDB

    第三方学习地址:http://blog.csdn.net/foruok/article/details/47746057 下载mongoDB https://www.mongodb.com/downl ...

  8. Mongoose Schemas定义中timestamps选项的妙用

    在Node.js中使用MongoDB少不了Mongoose. 假设有如下Mongoose Schemas的定义: var ItemSchema = new mongoose.Schema({ biz: ...

  9. Mongodb 数据类型及Mongoose常用CURD

    前言 看完了Node.js实战,其中在数据存储部分提到了Redis.Mongodb,我自己也根据书中的介绍写了几个简单的demo,在demo的过程首先遇到的问题就是数据类型和常见的CURD写法. mo ...

随机推荐

  1. ibevent 和 libev 提高网络应用性能【转】

    转自:https://www.cnblogs.com/kunhu/p/3632285.html 构建现代的服务器应用程序需要以某种方法同时接收数百.数千甚至数万个事件,无论它们是内部请求还是网络连接, ...

  2. 计算机中内存、cache和寄存器之间的关系及区别

    1. 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中,包含的寄存 器有指令寄存器(IR)和程序计数器(PC).在中央处理器 ...

  3. linux系统的三种网络连接模式

    VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1 ...

  4. 用户 'IIS APPPOOL\xxxx' 登录失败

    一.现象发布到iis后,网站出现以下提示异常详细信息: System.Data.SqlClient.SqlException: 用户 'IIS APPPOOL\IdealTest' 登录失败. 二.分 ...

  5. $Django cookies与session--解决无连接无状态问题, session配置

    session作用: 会话保持,记住用户的登录状态(WEB网站,分布式架构) 作用(和cookie的区别) 避免了敏感信息保存在客户端,防止客户端修改cookie信息! -cookie:存储在客户端浏 ...

  6. Mac 上卸载 Java

    如何在 Mac 上卸载 Java? 本文适用于: 平台: Macintosh OS X Java 版本: 7.0, 8.0 使用终端卸载 Oracle Java 注:要卸载 Java,必须具有管理员权 ...

  7. LA 3263 (欧拉定理)

    欧拉定理题意: 给你N 个点,按顺序一笔画完连成一个多边形 求这个平面被分为多少个区间 欧拉定理 : 平面上边为 n ,点为 c 则 区间为 n + 2 - c: 思路: 先扫,两两线段的交点,存下来 ...

  8. Laravel 5.2控制器--RESTful 资源控制器

    laravel的资源控制器 一.创建资源控制器 在命令行上,创建一个新的资源控制器 php artisan make:controller TestController --resource 然后在你 ...

  9. MySQL查询语句练习题,测试基本够用了

    Sutdent表的定义 字段名 字段描述 数据类型 主键 外键 非空 唯一 自增 Id 学号 INT(10) 是 否 是 是 是 Name 姓名 VARCHAR(20) 否 否 是 否 否 Sex 性 ...

  10. [其它]安装ios12 developer beta 3出错

    ios11设备升级到ios12有时候会出现 安装ios12 developer beta 3出错 提示.此时有一种可能就是,你手机或者ipad空间不足2G多(因为ios12是2.13G) 仅作为记录使 ...