详解Nodejs mongoose


Posted in NodeJs onJune 10, 2018

前言

Mongoose 是在nodejs环境下,对mongodb进行便捷操作的对象模型工具。本文介绍解(翻)密(译)Mongoose插件。

Schema

开始我们就要讲到Schema,一个Schema对应的是mongodb的collection(相当于SQL table),并且定义其结构。

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可用Type:

.String (ex: 'ABCD')

.Number (ex: 123)

.Date (ex: new Date)

.Buffer (ex: new Buffer(0))

.Boolean (ex: false)

.Schema.Types.Mixed (ex: {any:{thing:'ok'}})

.Schema.Types.ObjectId (ex:new mongoose.Types.ObjectID)

.Array (ex:[1,2,3])

.Schema.Types.Decimal128

.Map (ex: new Map([['key','value']]))

我们可以通过一段代码,将Schema转化成Model: mongoose.model(modelName,Schema)

var Blog = mongoose.model('Blog', blogSchema);

赋予Schema方法,当方法转成Model的时候,会将方法给予Model

//创建一个变量,Schema
var animalSchema = new Schema({ name: String, type: String });
//将方法赋予这个Schema
animalSchema.methods.findSimilarTypes = function(cb) {
  return this.model('Animal').find({ type: this.type }, cb);
};
var Animal = mongoose.model('Animal', animalSchema);
var dog = new Animal({ type: 'dog' });
dog.findSimilarTypes(function(err, dogs) {
  console.log(dogs); // woof
});

在Schema方法里,不要使用箭头函数,它会重新绑定this。

赋予Schema static (静态)方法,我们继续使用上面的例子:

//赋予静态方法,可以再Model不实例化的情况下调用
animalSchema.statics.findByName = function(name, cb) {
  return this.find({ name: new RegExp(name, 'i') }, cb);
};
var Animal = mongoose.model('Animal', animalSchema);
Animal.findByName('fido', function(err, animals) {
  console.log(animals);
});

Schema索引 index

MongoDB支持二级索引,在mongoose,我们可以将索引定在Schema层。

var animalSchema = new Schema({
  name: String,
  type: String,
  tags: { type: [String], index: true } // 声明在字段层
});
animalSchema.index({ name: 1, type: -1 }); // 声明在

使用index(二级索引)的时候记得要disable Mongodb 的 autoIndex。

mongoose.connect('mongodb://user:pass@localhost:port/database', { autoIndex: false });
 // 或者
mongoose.createConnection('mongodb://user:pass@localhost:port/database', { autoIndex: false });
 // 或者
animalSchema.set('autoIndex', false);
 // 或者
new Schema({..}, { autoIndex: false });

虚拟化

// 声明一个Schema
var personSchema = new Schema({
  name: {
   first: String,
   last: String
  }
});
// 转成Model
var Person = mongoose.model('Person', personSchema);
// 实例化Model
var axl = new Person({
  name: { first: 'Axl', last: 'Rose' }
});
//1.如果我们想要打印Person的姓名
console.log(axl.name.first + ' ' + axl.name.last); // Axl Rose
//2.使用虚拟化,我们声明一个虚拟字段,然后通过get给其赋值
personSchema.virtual('fullName').get(function () {
 return this.name.first + ' ' + this.name.last;
});
console.log(axl.fullName); // Axl Rose

别名

var personSchema = new Schema({
 n: {
  type: String,
  // 给予 n 别名 name,n与name指向同一个值
  alias: 'name'
 }
});
// 修改name同样修改n,方向一样
var person = new Person({ name: 'Val' });
console.log(person); // { n: 'Val' }
console.log(person.toObject({ virtuals: true })); // { n: 'Val', name: 'Val' }
console.log(person.name); // "Val"
person.name = 'Not Val';
console.log(person); // { n: 'Not Val' }

Model & Documents

var Tank = mongoose.model('Tank', yourSchema);
var small = new Tank({ size: 'small' });
//使用save的方法
small.save(function (err) {
 if (err) return handleError(err);
 // saved!
});
// 或者 使用create
Tank.create({ size: 'small' }, function (err, small) {
 if (err) return handleError(err);
 // saved!
});
// 或者 使用insertMany/insertOne
Tank.insertMany([{ size: 'small' }], function(err) {
});

//deleteOne 或者 deleteMany
Tank.deleteOne({ size: 'large' }, function (err) {
 if (err) return handleError(err);
 // 只删掉符合项的第一条
});

Tank.updateOne({ size: 'large' }, { name: 'T-90' }, function(err, res) {
});
// findOneAndUpdate 查找出相应的数据,修改,并返还给程序

// 查提供了多种方式,find,findById,findOne,和where
Tank.find({ size: 'small' }).where('createdDate').gt(oneYearAgo).exec(callback);

总结

以上所述是小编给大家介绍的Nodejs mongoose的相关知识,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

NodeJs 相关文章推荐
Nodejs极简入门教程(二):定时器
Oct 25 NodeJs
初始Nodejs
Nov 08 NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
nodejs实现的一个简单聊天室功能分享
Dec 06 NodeJs
iPhone手机上搭建nodejs服务器步骤方法
Jul 06 NodeJs
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
Aug 21 NodeJs
windows 下安装nodejs 环境变量设置
Feb 02 NodeJs
Nodejs中使用captchapng模块生成图片验证码
May 18 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
NodeJS 实现多语言的示例代码
Sep 11 NodeJs
nodejs实现用户登录路由功能
May 22 NodeJs
Nodejs异步流程框架async的方法
Jun 07 NodeJs
详解NodeJs开发微信公众号
May 25 #NodeJs
nodejs express配置自签名https服务器的方法
May 22 #NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 #NodeJs
解决nodejs的npm命令无反应的问题
May 17 #NodeJs
Mac下通过brew安装指定版本的nodejs教程
May 17 #NodeJs
对mac下nodejs 更新到最新版本的最新方法(推荐)
May 17 #NodeJs
nodejs前端模板引擎swig入门详解
May 15 #NodeJs
You might like
关于初学PHP时的知识积累总结
2013/06/07 PHP
php 魔术方法详解
2014/11/11 PHP
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
jquery操作cookie插件分享
2014/01/14 Javascript
js window.open弹出新的网页窗口
2014/01/16 Javascript
Javascript闭包用法实例分析
2015/01/23 Javascript
node-http-proxy修改响应结果实例代码
2016/06/06 Javascript
浅谈在js传递参数中含加号(+)的处理方式
2016/10/11 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
2018/09/01 Javascript
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
JavaScrip如果基于url实现图片下载
2020/07/03 Javascript
JavaScript经典案例之简易计算器
2020/08/24 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
JS实现小米轮播图
2020/09/21 Javascript
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
详谈在flask中使用jsonify和json.dumps的区别
2018/03/26 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
卡西欧B级产品官方网站:Casio Outlet
2018/05/22 全球购物
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
大众服装店创业计划书范文
2014/01/01 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
师德建设实施方案
2014/03/21 职场文书
小学竞选班长演讲稿
2014/09/09 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
Mysql官方性能测试工具mysqlslap的使用简介
2021/05/21 MySQL
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android