[转] mongoose 之Shema
总 之见到我写点啥简直是奇迹,由于现在喜欢上玩转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的更多相关文章
- Nodejs之MEAN栈开发(三)---- 使用Mongoose创建模型及API
继续开扒我们的MEAN栈开发之路,前面两节我们学习了Express.Jade引擎并创建了几个静态页面,最后通过Heroku部署了应用. Nodejs之MEAN栈开发(一)---- 路由与控制器 Nod ...
- mongoose 建立schema 和model
在node中使用MongoDB很多情况下,都是使用mongoose的,所以这集来介绍一下 安装 yarn add mongoose 连接 const mongoose = require(" ...
- mongoose - 让node.js高效操作mongodb
Mongoose库简而言之就是在node环境中操作MongoDB数据库的一种便捷的封装,一种对象模型工具,类似ORM,Mongoose将数据库中的数据转换为JavaScript对象以供你在应用中使用. ...
- 在mongoose中使用$match对id失效的解决方法
Topic.aggregate( //{$match:{_id:"5576b59e192868d01f75486c"}}, //not work //{$match:{title: ...
- Mongo基础使用,以及在Express项目中使用Mongoose
MongoDB的基本使用 MongoDB特点: 使用BSON存储数据 支持相对丰富的查询操作(相对其他nosql数据库) 支持索引 副本集(支持多个实例/多个服务器运行同个数据库) 分片(数据库水平扩 ...
- mongoose数据库连接和操作
var mongoose = require('mongoose') mongoose.connect('mongodb://localhost:27017/hometown'); var db = ...
- mongoose 和 mongoDB
第三方学习地址:http://blog.csdn.net/foruok/article/details/47746057 下载mongoDB https://www.mongodb.com/downl ...
- Mongoose Schemas定义中timestamps选项的妙用
在Node.js中使用MongoDB少不了Mongoose. 假设有如下Mongoose Schemas的定义: var ItemSchema = new mongoose.Schema({ biz: ...
- Mongodb 数据类型及Mongoose常用CURD
前言 看完了Node.js实战,其中在数据存储部分提到了Redis.Mongodb,我自己也根据书中的介绍写了几个简单的demo,在demo的过程首先遇到的问题就是数据类型和常见的CURD写法. mo ...
随机推荐
- 【转】gcc中的-w -W和-Wall选项
-w的意思是关闭编译时的警告,也就是编译后不显示任何warning,因为有时在编译之后编译器会显示一些例如数据转换之类的警告,这些警告是我们平时可以忽略的. -Wall选项意思是编译后显示所有警告. ...
- 统一门户与业务系统的sso整合技术方案(单点登录)
一.单点登录(SSO,Single Sign On)整合目前计划接入统一门户的所有业务系统均为基于JavaEE技术的B/S架构系统.由于统一门户的单点登录技术选用的是JA-SIG组织开发的Cas Se ...
- windows server 2008开启共享文件设置
之前设置过共享文件,将共享文件映射成磁盘,重新去设置另外服务器的时候,又到网络上找,特此记录 设置网络共享需要开启的服务如下: 以下服务都相关,需要全部开启后才能保证共享正常:1,UPnP Devic ...
- LabVIEW--为控件添加说明信息
之前只知道为VI添加说明信息(在VI的属性里面添加,快捷键ctrl+I 打开),今天知道了控件也可以添加说明信息,这样就方便了许多,极大的提高了程序的可读性.
- (二)远程代理Remoting/RealProxy
使用.Net Remoting/RealProxy 采用TransparentProxy和RealProxy实现对象的代理,实现思路如下:Client -TransparentProxy - Real ...
- Java中instanceof与getClass的区别
在比较一个类和另一个类是否属于同一个类实例的时候,通常可以采用instanceof和getClass两种方法比较两者是否相等来判断,但是两者在判断上面是有差别的,下面通过代码说明: public cl ...
- Ex4_21 最短路径算法可以应用于货币交易领域..._第十二次作业
(a) 建立一个有向图G(V,E),每个顶点表示一种货币,两个顶点之间的边权的大小ex[u][v]表示两种货币之间的汇率,若要找一个最有利的兑换序列,把货币s兑换成货币t,即在若干种兑换序列中选择 ...
- 31)django-序列化
目录 1)序列化 2)为什么不用json序列化 3)django序列化QuerySet,ErrorDict数据 一:序列化 序列化是将对象状态转换为可保持或传输的格式的过程 反序列化是指将存储在存储媒 ...
- Confluence 6 修改站点的标识图片
你可以通过修改标识图片(Logos)来修改你 Confluence 站点的外观和感觉. 你可以修改: 站点标识图片(site logo) 为所有空间修改默认空间标识图片(default space l ...
- python 爬虫简化树状图