详解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教程之环境安装及运行
Nov 21 NodeJs
轻松创建nodejs服务器(9):实现非阻塞操作
Dec 18 NodeJs
nodejs开发微博实例
Mar 25 NodeJs
NodeJs中的VM模块详解
May 06 NodeJs
NodeJS创建基础应用并应用模板引擎
Apr 12 NodeJs
NodeJS连接MongoDB数据库时报错的快速解决方法
May 13 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
详解NODEJS的http实现
Jan 04 NodeJs
webstorm中配置nodejs环境及npm的实例
May 15 NodeJs
手把手教你如何使用nodejs编写cli命令行
Nov 05 NodeJs
NodeJS多种创建WebSocket监听的方式(三种)
Jun 04 NodeJs
如何利用nodejs自动定时发送邮件提醒(超实用)
Dec 01 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/07/03 PHP
PHP使用SOAP扩展实现WebService的方法
2016/04/01 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
js防止表单重复提交实现代码
2012/09/05 Javascript
用js代码改变单选框选中状态的简单实例
2013/12/18 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
ES6 class的应用实例分析
2019/06/27 Javascript
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
python实现对一个完整url进行分割的方法
2015/04/29 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
python学习开发mock接口
2019/04/28 Python
python文字转语音的实例代码分析
2019/11/12 Python
Python数据可视化图实现过程详解
2020/06/12 Python
使用pytorch 筛选出一定范围的值
2020/06/28 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
canvas使用注意点总结
2013/07/19 HTML / CSS
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
实习自我评价怎么写
2013/12/02 职场文书
毕业生找工作的求职信范文
2013/12/24 职场文书
高校十八大报告感想
2014/01/27 职场文书
村党支部换届选举方案
2014/05/02 职场文书
小学竞选班长演讲稿
2014/09/09 职场文书
司机工作自我鉴定
2014/09/19 职场文书
2014年计生工作总结
2014/11/21 职场文书
2019年幼儿园管理条例范本!
2019/07/17 职场文书
python中%格式表达式实例用法
2021/06/18 Python