详解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(一)--- Node.js简介及安装开发环境
May 20 NodeJs
nodejs中转换URL字符串与查询字符串详解
Nov 26 NodeJs
nodejs下打包模块archiver详解
Dec 03 NodeJs
nodejs 整合kindEditor实现图片上传
Feb 03 NodeJs
NodeJS中利用Promise来封装异步函数
Feb 25 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
nodejs 图解express+supervisor+ejs的用法(推荐)
Sep 08 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
原生nodejs使用websocket代码分享
Apr 07 NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 NodeJs
nodeJS进程管理器pm2的使用
Jan 09 NodeJs
Sublime Text3 配置 NodeJs 环境的方法
May 20 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完全过滤HTML,JS,CSS等标签
2009/01/16 PHP
PHP 文件上传全攻略
2010/04/28 PHP
基于PHP5魔术常量与魔术方法的详解
2013/06/13 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
js中的值类型和引用类型小结 文字说明与实例
2010/12/12 Javascript
jqgrid 简单学习笔记
2011/05/03 Javascript
JS的get和set使用示例
2014/02/20 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
原生js和jquery分别实现横向导航菜单效果
2016/05/13 Javascript
js获取元素的标签名实现方法
2016/10/08 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
js实现删除li标签一行内容
2019/04/16 Javascript
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
Python多线程实例教程
2014/09/06 Python
在Python的web框架中配置app的教程
2015/04/30 Python
简单谈谈Python流程控制语句
2016/12/04 Python
python 使用pandas计算累积求和的方法
2019/02/08 Python
基于python生成器封装的协程类
2019/03/20 Python
python多线程下信号处理程序示例
2019/05/31 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
django框架中间件原理与用法详解
2019/12/10 Python
Python中如何添加自定义模块
2020/06/09 Python
css3图片边框border-image的用法
2017/06/30 HTML / CSS
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
小学生防溺水广播稿
2014/01/12 职场文书
经销商培训邀请函
2014/01/21 职场文书
医学生临床实习自我评价
2014/03/07 职场文书
小学优秀班主任材料
2014/12/17 职场文书
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang
Python数组变形的几种实现方法
2022/05/30 Python