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 相关文章推荐
Extjs入门之动态加载树代码
Apr 09 Javascript
学习JavaScript编程语言的8张思维导图分享
Mar 27 Javascript
jQuery实现文本框输入同步的方法
Jun 20 Javascript
Javascript验证方法大全
Sep 21 Javascript
详解AngularJS中的filter过滤器用法
Jan 04 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
Jun 12 Javascript
全面理解闭包机制
Jul 11 Javascript
jQuery中$.grep() 过滤函数 数组过滤
Nov 22 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
Jun 08 Javascript
详解Node.js access_token的获取、存储及更新
Jun 20 Javascript
vue数组对象排序的实现代码
Jun 20 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
Jun 03 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
php判断变量类型常用方法
2012/04/24 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
PDO::quote讲解
2019/01/29 PHP
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
js内置对象 学习笔记
2011/08/01 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
jquery的选择器的使用技巧之如何选择input框
2013/09/22 Javascript
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
基于JavaScript实现的插入排序算法分析
2017/04/14 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
基于es6三点运算符的使用方法(实例讲解)
2017/10/12 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
Vue+ElementUI table实现表格分页
2019/12/14 Javascript
vue实现评价星星功能
2020/06/30 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
[02:46]2014DOTA2国际邀请赛 选手为你解读比赛MVP充满梦想
2014/07/09 DOTA
用Python的pandas框架操作Excel文件中的数据教程
2015/03/31 Python
python处理图片之PIL模块简单使用方法
2015/05/11 Python
Python pandas常用函数详解
2018/02/07 Python
python中实现字符串翻转的方法
2018/07/11 Python
Python实现带参数的用户验证功能装饰器示例
2018/12/14 Python
python sort、sort_index方法代码实例
2019/03/28 Python
详解Python多线程下的list
2020/07/03 Python
浅谈python处理json和redis hash的坑
2020/07/16 Python
工程造价自荐信
2013/10/09 职场文书
简历自荐信
2013/12/02 职场文书
优秀员工自荐书范文
2013/12/08 职场文书
yy结婚证婚词
2014/01/10 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
员工表扬信怎么写
2015/05/05 职场文书
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python