详解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读取JSON文件格式化时的注意事项
Sep 25 NodeJs
nodeJs链接Mysql做增删改查的简单操作
Feb 04 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
docker中编译nodejs并使用nginx启动
Jun 23 NodeJs
nodeJs爬虫的技术点总结
May 13 NodeJs
webstorm中配置nodejs环境及npm的实例
May 15 NodeJs
nodejs 如何手动实现服务器
Aug 20 NodeJs
nodejs实现范围请求的实现代码
Oct 12 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
Feb 02 NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 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中使用session防止用户非法登录后台的方法
2015/01/27 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
js下获取div中的数据的原理分析
2010/04/07 Javascript
jquery获取复选框被选中的值
2014/03/22 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
javascript 实现map集合
2015/04/03 Javascript
java中String类型变量的赋值问题介绍
2016/03/23 Javascript
深入浅析javascript中的作用域(推荐)
2016/07/19 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
JavaScript变量类型以及变量作用域详解
2017/08/14 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
vue实现PC端录音功能的实例代码
2019/06/05 Javascript
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
python3调用R的示例代码
2018/02/23 Python
python3实现windows下同名进程监控
2018/06/21 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
解决更改AUTH_USER_MODEL后出现的问题
2020/05/14 Python
django 解决自定义序列化返回处理数据为null的问题
2020/05/20 Python
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
Chemist Warehouse中文网:澳洲连锁大药房
2021/02/05 全球购物
党员批评与自我批评总结
2014/10/15 职场文书
教师党员批评与自我批评
2014/10/15 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
2015年财政局工作总结
2015/05/21 职场文书
2016情人节宣传语
2015/07/14 职场文书
学习社交礼仪心得体会
2016/01/22 职场文书
完美处理python与anaconda环境变量的冲突问题
2021/04/07 Python
Python Socket编程详解
2021/04/25 Python
Java无向树分析 实现最小高度树
2022/04/09 Javascript