详解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的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Jul 26 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
详解HTTPS 的原理和 NodeJS 的实现
Jul 04 NodeJs
nodejs模块学习之connect解析
Jul 05 NodeJs
nodejs实现大文件(在线视频)的读取
Oct 16 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
nodejs 使用nodejs-websocket模块实现点对点实时通讯
Nov 28 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
NodeJS模块Buffer原理及使用方法解析
Nov 11 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 5.3新增魔术方法__invoke概述
2014/07/23 PHP
smarty缓存用法分析
2014/12/16 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
2018/08/04 PHP
PHP学习记录之常用的魔术常量详解
2019/12/12 PHP
你可能不再需要JQUERY
2021/03/09 Javascript
论坛特效代码收集(落伍转发-不错)
2006/12/02 Javascript
js 获取服务器控件值的代码
2010/03/05 Javascript
javascript中的prototype属性实例分析说明
2010/08/09 Javascript
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
2013/11/18 NodeJs
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
2016/07/09 Javascript
JS前端加密算法示例
2016/12/22 Javascript
JS数组返回去重后数据的方法解析
2017/01/03 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
vue 将页面公用的头部组件化的方法
2017/12/18 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
python zip文件 压缩
2008/12/24 Python
python编写暴力破解zip文档程序的实例讲解
2018/04/24 Python
python3.4.3下逐行读入txt文本并去重的方法
2018/04/29 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
2020/05/17 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
如何使用scrapy中的ItemLoader提取数据
2020/09/30 Python
数学检讨书1000字
2014/02/24 职场文书
中式结婚主持词
2014/03/14 职场文书
市政管理求职信范文
2014/05/07 职场文书
酒店节能减排方案
2014/05/26 职场文书
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android