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判断元素是否是隐藏的代码
Apr 24 Javascript
js图片延迟加载的实现方法及思路
Jul 22 Javascript
JavaScript SetInterval与setTimeout使用方法详解
Nov 15 Javascript
调试代码导致IE出错的避免方法
Apr 04 Javascript
javascript实现动态模态绑定grid过程代码
Sep 22 Javascript
alert出数组中的随即值代码
Sep 25 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
Jun 12 Javascript
Bootstrap Validator 表单验证
Jul 25 Javascript
Javascript Function.prototype.bind详细分析
Dec 29 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
Dec 07 Javascript
Vue.js添加组件操作示例
Jun 13 Javascript
如何测量vue应用运行时的性能
Jun 21 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
十大“创意”战术!
2020/03/04 星际争霸
PHP 字符串 小常识
2009/06/05 PHP
深入理解PHP原理之异常机制
2010/08/21 PHP
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
2014/01/03 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
2017/04/04 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
php对象工厂类完整示例
2018/08/09 PHP
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
IE8中使用javascript动态加载CSS的解决方法
2014/06/17 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
js实现文本框输入文字个数限制代码
2015/12/25 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
canvas实现动态小球重叠效果
2017/02/06 Javascript
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
BootStrap自定义popover,点击区域隐藏功能的实现
2018/01/23 Javascript
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
浅谈VUE单页应用首屏加载速度优化方案
2018/08/28 Javascript
微信小程序开发之tabbar图标和颜色的实现
2018/10/17 Javascript
JavaScript实现通讯录功能
2020/12/27 Javascript
[03:15]2014DOTA2国际邀请赛 专访国士无双信心满满
2014/07/12 DOTA
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
简单的Python抓taobao图片爬虫
2014/10/26 Python
运动检测ViBe算法python实现代码
2018/01/09 Python
python中pika模块问题的深入探究
2018/10/13 Python
Python实现的序列化和反序列化二叉树算法示例
2019/03/02 Python
完美解决jupyter由于无法import新包的问题
2020/05/26 Python
HTML5 LocalStorage 本地存储详细概括(多图)
2017/08/18 HTML / CSS
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
英文求职信写作小建议
2014/02/16 职场文书
成绩报告单家长评语
2014/12/30 职场文书
微信小程序实现录音Record功能
2021/05/09 Javascript
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS
使用MybatisPlus打印sql语句
2022/04/22 SQL Server