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 相关文章推荐
最新28个很棒的jQuery 教程
May 28 Javascript
js css后面所带参数含义介绍
Aug 18 Javascript
jQuery学习笔记之基础中的基础
Jan 19 Javascript
js判断是否按下了Shift键的方法
Jan 27 Javascript
bootstrap table复杂操作代码
Nov 01 Javascript
正则表达式替换html元素属性的方法
Nov 26 Javascript
微信小程序block的使用教程
Apr 01 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
May 13 Javascript
10行代码实现微信小程序滑动tab切换
Dec 28 Javascript
js实现炫酷光感效果
Sep 05 Javascript
js+canvas实现刮刮奖功能
Sep 13 Javascript
Javascript生成器(Generator)的介绍与使用
Jan 31 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
PHILIPS L4X25T电路分析和打理
2021/03/02 无线电
php目录操作实例代码
2014/02/21 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
PhotoSwipe异步动态加载图片方法
2016/08/25 Javascript
javascript中异常处理案例(推荐)
2016/10/03 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
Avalonjs 实现简单购物车功能(实例代码)
2017/02/07 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
关于JavaScript的单双引号嵌套问题
2017/08/20 Javascript
关于Webpack dev server热加载失败的解决方法
2018/02/22 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
React+Redux实现简单的待办事项列表ToDoList
2019/09/29 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
Python采用Django制作简易的知乎日报API
2016/08/03 Python
python逐行读写txt文件的实例讲解
2018/04/03 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
利用pandas将非数值数据转换成数值的方式
2019/12/18 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
物理力学求职信
2014/02/18 职场文书
小班秋游活动方案
2014/02/22 职场文书
学校党员对照检查材料
2014/08/28 职场文书
反四风对照检查材料思想汇报
2014/09/16 职场文书
2015年个人自我剖析材料
2014/12/29 职场文书
办公室主任个人总结
2015/02/28 职场文书
2015年学生会个人工作总结
2015/04/09 职场文书
2016学校元旦晚会经典开场白台词
2015/12/03 职场文书
受欢迎的自荐信,就这么写!
2019/04/19 职场文书