Node.js的MongoDB驱动Mongoose基本使用教程


Posted in Javascript onMarch 01, 2016

使用mongoose可以让我们更好使用mongodb数据库,而不需要写繁琐的业务逻辑。

安装

npm install mongoose

初始化使用
使用mongoose前,需安装node和mongodb,这里不讲node和mongodb的安装方法。

var mongoose = require("mongoose");
 var Schema = mongoose.Schema;
 var db = mongoose.connection;
 mongoose.connect('mongodb://localhost/animal');
 db.on('error', console.error);
 db.once('open', function() {
  //这里建立模式和模型
 }

快速入门
在mongoose中,所有的数据都是一种模式,每个模式都映射到mongodb的集合,并且定义该集合文件结构。

//这里建立一个动物的模式,所有动物都拥有这个模式下的所有属性
 var animalSchema = new Schema({
  name: String,
  age: Number,
 });

模型是我们从Schema中定义的一种多样化的构造函数,模型的实例可以使用很多操作,所有文档的创建和检索都是由模型来处理

var animalMode = db.model('Animal', animalSchema);

模型的实例实质是文件,而我们可以很轻松创建、修改这种文件

var cat = new animalMode({
  name: 'catName',
  age: '7', //这里依然使用字符串,mongoose会自动转换类型
  });

 cat.save(function(err, thor) {
  if (err) return console.log(err);
  console.log(thor);
 });
 //或者可以使用create
 //cat.create(function(err, thor) {
 // if (err) return console.log(err);
 // console.log(thor);
 //});

 //执行查找
 animalMode.find(function(err, people){
  if(err) console.log(err);
  console.log(people);
 });
 //查找符合条件数据
 animalMode.findOne({title: 'catName'}, function(err, cat){
  if(err) console.log(err);
  console.log(cat);
 });

Schema
数据类型

这是Schema中所有的数据类型,包括mongoose自定的数据类型

  • String
  • Number
  • Date
  • Buffer
  • Boolean
  • Mixed
  • ObjectId
  • Array

每种数据类型的使用

var animalMode = mongoose.model('Animal', schema);

 var cat = new animalMode;
 cat.name = 'Statue of Liberty'    //String
 cat.age = '7';        //Number
 cat.updated = new Date;      //Date
 cat.binary = new Buffer(0);     //Buffer
 cat.living = false;       //Boolean
 cat.mixed = { any: { thing: 'i want' } }; //Mixed    
 cat._someId = new mongoose.Types.ObjectId; //ObjectId
 cat.ofString.push("strings!");    //Array

其中Mixed是mongoose自定义的一种混合类型,因为Mixed没有定义具体内容,可以用{}来使用,以下2种定义形式等价。

var animalSchema = new Schema({any: {}});
 var animalSchema = new Schema({any: {Schema.Types.Mixed}});

自定义方法

可以为Schema绑定方法

var animalSchema = new Schema({
  name: String,
  age: Number,
 });

 animalSchema.methods.findSimilarTypes = function (cb) {
  return this.model('Animal').find({ name: this.name }, cb);
 }

 var animalMode = db.model('Animal', animalSchema);

 cat.findSimilarTypes(function(err, cat){
  if(err) console.log(err);
  console.log(cat);
 });

也可以为Schema添加静态方法

animalSchema.statics.findByName = function (name, cb) {
  return this.find({ name: new RegExp(name, 'i') }, cb);
 }
 var animalMode = db.model('Animal', animalSchema);

 animalMode.findByName('catName', function (err, animals) {
  console.log(animals);
 });

索引

我们可以为mongodb数据建立索引,mongodb支持二级索引,为了提高数据查找和定位,建立复合索引是必要的

var animalSchema = new Schema({
  name: String,
  age: Number,
  tags: { age: [String], index: true } // field level
 });

 animalSchema.index({ name: 1, age: -1 }); // schema level

但是这种索引的建立可能导致显著的性能影响,建议在生产下停止,将设置模式下的自动索引设置为false禁止

animalSchema.set('autoIndex', false);
 // or
 new Schema({..}, { autoIndex: false });

Model
C

cat.save(function(err, thor) {
  if (err) return console.log(err);
  console.log(thor);
 });
 //或者可以使用create
 cat.create(function(err, thor) {
  if (err) return console.log(err);
  console.log(thor);
 });

R

//find
animalMode.find(function(err, cat){
 if (err) console.log(err);
 console.log(cat);
})

//findOne
animalMode.findOne({name: 'catName'}, function(err, cat){
 if (err) console.log(err);
 console.log(cat);
})

//findByID
//与 findOne 相同,但它接收文档的 _id 作为参数,返回单个文档。_id //可以是字符串或 ObjectId 对象。
animalMode.findById(id, function(err, adventure){
 if (err) consoel.log(err);
 console.log(adventure);
});

//where
//查询数据类型是字符串时,可支持正则
animalMode.where('age', '2').exec(function(err, cat){
 if (err) console.log(err);
 console.log(cat);
});

animalMode
 .where('age').gte(1).lte(10)
 .where('name', 'catName')
 .exec(function(err, cat){
  if (err) console.log(err);
  console.log(cat);
 });

U
官方文档提供的更新函数Model.update

Model.update(conditions, doc, [options], [callback])

  • conditions 更新条件
  • doc 更新内容
  • option 更新选项
  • safe (boolean) 安全模式,默认选项,值为true
  • upsert (boolean) 条件不匹配时是否创建新文档,默认值为false
  • multi (boolean) 是否更新多个文件,默认值为false
  • strict (boolean) 严格模式,只更新一条数据
  • overwrite (boolean) 覆盖数据,默认为false
  • callback
  • err 更新数据出错时返回值
  • numberAffected (笔者暂时不清楚)
  • rawResponse 受影响的行数
animalMode.update({name: 'catName'}, {age: '6'}, {multi : true}, function(err, numberAffected, raw){
 if (err) return console.log(err);
 console.log('The number of updated documents was %d', numberAffected);
 console.log('The raw response from Mongo was ', raw);
});

D

animalMode.remove({age: 6}, function(err){
 if (err) console.log(err);
})

其它
//返回文档数

animalMode.count({age: 2}, function(err, cat){
 if (err) console.log(err);
 console.log(cat);
})
Javascript 相关文章推荐
符合标准的js表单提交的代码
Sep 13 Javascript
ExtJs GridPanel简单的增删改实现代码
Aug 26 Javascript
浅谈javascript 函数属性和方法
Jan 21 Javascript
javascript实现任务栏消息提示的简单实例
May 31 Javascript
全面解析Javascript无限添加QQ好友原理
Jun 15 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
Dec 14 Javascript
用move.js库实现百叶窗特效
Feb 08 Javascript
JavaScript箭头函数_动力节点Java学院整理
Jun 28 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
Oct 25 Javascript
jQuery实现简易聊天框
Feb 08 jQuery
JavaScript 装逼指南(js另类写法)
May 10 Javascript
React如何使用axios请求数据并把数据渲染到组件
Aug 05 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
Mar 01 #Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
Mar 01 #Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
Mar 01 #Javascript
JavaScript html5 canvas绘制时钟效果
Mar 01 #Javascript
javascript使用Promise对象实现异步编程
Mar 01 #Javascript
javascript html5实现表单验证
Mar 01 #Javascript
javascript中FOREACH数组方法使用示例
Mar 01 #Javascript
You might like
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
php压缩文件夹最新版
2018/07/18 PHP
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
基于jquery的图片的切换(以数字的形式)
2011/02/14 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
js怎么覆盖原有方法实现重写
2014/09/04 Javascript
javascript属性访问表达式用法分析
2015/04/25 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
JavaScript实现动态删除列表框值的方法
2015/08/12 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
利用JS实现数字增长
2016/07/28 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
Angular.js中数组操作的方法教程
2017/07/31 Javascript
简单的Vue SSR的示例代码
2018/01/12 Javascript
vue打包的时候自动将px转成rem的操作方法
2018/06/20 Javascript
vue自动路由-单页面项目(非build时构建)
2019/04/30 Javascript
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
python读写文件操作示例程序
2013/12/02 Python
python练习程序批量修改文件名
2014/01/16 Python
python修改注册表终止360进程实例
2014/10/13 Python
Python内置函数之filter map reduce介绍
2014/11/30 Python
用Python解决计数原理问题的方法
2016/08/04 Python
Python实现excel转sqlite的方法
2017/07/17 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
python 字段拆分详解
2019/12/17 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
Python实现自动签到脚本功能
2020/08/20 Python
七年级地理教学反思
2014/01/26 职场文书
快递员岗位职责
2014/09/12 职场文书
法制教育观后感
2015/06/17 职场文书
MySql 缓存查询原理与缓存监控和索引监控介绍
2021/07/02 MySQL
vue3语法糖内的defineProps及defineEmits
2022/04/14 Vue.js