详解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实现Websocket的数据接收与发送
Nov 19 NodeJs
nodejs进阶(6)—连接MySQL数据库示例
Jan 07 NodeJs
解析NodeJS异步I/O的实现
Apr 13 NodeJs
nodejs接入阿里大鱼短信验证码的方法
Jul 10 NodeJs
详解nodejs的express如何自动生成项目框架
Jul 12 NodeJs
nodejs实现的连接MySQL数据库功能示例
Jan 25 NodeJs
NodeJS简单实现WebSocket功能示例
Feb 10 NodeJs
详解Nodejs mongoose
Jun 10 NodeJs
Nodejs中的JWT和Session的使用
Aug 21 NodeJs
详解从NodeJS搭建中间层再谈前后端分离
Nov 13 NodeJs
nodejs中实现修改用户路由功能
May 24 NodeJs
nodeJs项目在阿里云的简单部署
Nov 27 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初学者的8点有效建议
2010/11/20 PHP
PHP strtotime函数用法、实现原理和源码分析
2015/02/04 PHP
php计算title标题相似比的方法
2015/07/29 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
2018/10/17 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
laravel5环境隐藏index.php后缀(apache)的方法
2019/10/12 PHP
Laravel 修改默认日志文件名称和位置的例子
2019/10/17 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
学习从实践开始之jQuery插件开发 对话框插件开发
2012/04/26 Javascript
js和jquery设置disabled属性为true使按钮失效
2014/08/07 Javascript
三种取消选中单选框radio的方法
2014/09/09 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
Bootstrap Chart组件使用教程
2016/04/28 Javascript
深入浅析JS Function()构造函数
2016/08/22 Javascript
react实现菜单权限控制的方法
2017/12/11 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
jQuery实现每日秒杀商品倒计时功能
2019/09/06 jQuery
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
jquery实现聊天机器人
2020/02/08 jQuery
python使用webbrowser浏览指定url的方法
2015/04/04 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
2018/06/13 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
2019/03/18 Python
Python Pandas 转换unix时间戳方式
2019/12/07 Python
Python configparser模块配置文件过程解析
2020/03/03 Python
python上selenium的弹框操作实现
2020/07/13 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
2020/11/13 Python
解决pytorch下出现multi-target not supported at的一种可能原因
2021/02/06 Python
光声世纪笔试题目
2012/08/25 面试题
关于感恩的演讲稿800字
2014/08/26 职场文书
乡镇党委书记第三阶段个人整改措施
2014/09/16 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书