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 相关文章推荐
从零开始学习jQuery (三) 管理jQuery包装集
Feb 23 Javascript
自己编写的类似JS的trim方法
Oct 09 Javascript
Jquery通过Ajax访问XML数据的小例子
Nov 18 Javascript
基于javascript实现判断移动终端浏览器版本信息
Dec 09 Javascript
轻松实现Bootstrap图片轮播
Apr 20 Javascript
JavaScript判断用户名和密码不能为空的实现代码
May 16 Javascript
微信小程序 Storage API实例详解
Oct 02 Javascript
微信小程序 自定义对话框实例详解
Jan 20 Javascript
十分钟带你快速了解React16新特性
Nov 10 Javascript
JS实现的base64加密解密操作示例
Apr 18 Javascript
vue-resource post数据时碰到Django csrf问题的解决
Mar 13 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 Vue.js
详解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
PHP 采集心得技巧
2009/05/15 PHP
浅析php中如何在有限的内存中读取大文件
2013/07/02 PHP
php中的curl_multi系列函数使用例子
2014/07/29 PHP
Laravel 5 框架入门(三)
2015/04/09 PHP
PHP使用递归算法无限遍历数组示例
2017/01/13 PHP
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
页面中body onload 和 window.onload 冲突的问题的解决
2009/07/01 Javascript
JS 进度条效果实现代码整理
2011/05/21 Javascript
用Mootools获得操作索引的两种方法分享
2011/12/12 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
JS获取地址栏参数的几种方法小结
2014/02/28 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
2017/02/13 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
在vue中获取dom元素内容的方法
2017/07/10 Javascript
JavaScript 保护变量不被随意修改的实现代码
2017/09/27 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
原生js实现购物车功能
2020/09/23 Javascript
Vue中父子组件的值传递与方法传递
2020/09/28 Javascript
python使用多线程不断刷新网页的方法
2015/03/31 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
python实现画出e指数函数的图像
2019/11/21 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
2020/05/17 Python
python设置中文界面实例方法
2020/10/27 Python
青年志愿者事迹材料
2014/02/07 职场文书
小学毕业感言300字
2014/02/19 职场文书
关爱残疾人标语
2014/06/25 职场文书
离婚协议书范本及离婚须知
2014/10/15 职场文书
优秀教师个人总结
2015/02/11 职场文书
史上最全的军训拉歌口号
2015/12/25 职场文书
JavaScript 语句之常用 for 循环详解
2021/03/29 Javascript
Python Parser的用法
2021/05/12 Python