详解Wondows下Node.js使用MongoDB的环境配置


Posted in Javascript onMarch 01, 2016

为了保存网站的用户数据和业务数据,通常需要一个数据库。MongoDB和Node.js特别般配,因为MongoDB是基于文档的非关系型数据库,文档是按BSON(JSON的轻量化二进制格式)存储的,增删改查等管理数据库的命令和JavaScript语法很像。如果你在Node.js里访问MongoDB的数据,会有我们是一家人的感觉,特别亲切。

我也准备使用MongoDB来作为我的数据库。

MongoDB使用集合(collection)和文档(document)来描述和存储数据,collection就相当于表,document相当于行,不过MySQL之类的关系型数据库,表结构是固定的,比如某一行由若干列组成,行行都一样,而MongoDB不同,一个集合里的多个文档可以有不同的结构,更灵活一些。

安装Mongo

详细指南在这里(MongoDB的官方文档):https://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/。

到https://www.mongodb.org/downloads下载安装包,Windows系统是msi文件,我选择的是“Windows 64-bit 2008 R2+”这个版本。

安装非常简单,你可以默认,也可以选择安装位置,我装到了G盘MongoDB目录下。安装完后,目录结构是这样的:G:\MongoDB\Server\3.0\。

mongod、mongo以及其它的工具,都在3.0目录下的bin目录。

启动

要使用MongoDB,需要指定一个文件夹让它存放数据,我在G:\MongoDB下建立了一个名为db的文件夹。

打开cmd,进入G:\MongoDB\Server\3.0\bin目录,执行“mongod ?dbpath=G:\MongoDB\db”,就会启动MongoDB,看到下面的图:

详解Wondows下Node.js使用MongoDB的环境配置

MongoDB启动后,会监听在一个端口上等待客户端来连接,从上图可以看出,默认监听的端口是27017。你可以“?port”选项改变这个端口,比如“mongod ?port 28018 ?dbpath=G:\MongoDB\db”命令就会启动MongoDB并监听28018端口。

启动了MongoDB,我们就可以使用mongo(交互式shell)来管理数据库了。直接在bin目录下执行mongo,就可以看到下图:

详解Wondows下Node.js使用MongoDB的环境配置

mongo Shell默认连接到了test数据库,还告诉我们可以输入help来查看帮助。你可以键入help并回车,看看都有哪些命令可用。

注意,mongod默认启动时不带鉴权,客户端连上后就可以随便操作,建库、增删改查等统统可以。你要想限制用户权限,可以自己配置下,我这里就直接往下走了。

安装mongoose驱动

安装GIT工具:
由于github网站不支持直接下载打包了所有submodule的源码包,所以需要通过git工具来签出所有的源码。从http://code.google.com/p/msysgit/downloads/list,可以下载到msysgit这个Windows平台下的git客户端工具(最新版本文件为Git-1.7.7.1-preview20111027.exe)。在下载之后双击安装。

下载NPM源码:
打开命令行工具(CMD),执行以下命令,可以通过msysgit签出NPM的所有源码和依赖代码并安装npm。

git clone --recursive git://github.com/isaacs/npm.git
cd npm
node cli.js install npm -gf

在执行这段代码之前,请确保node.exe是跟通过node.msi的方式安装的,或者在PATH环境变量中。这段命令也会将npm加入到PATH环境变量中去,之后可以随处执行npm命令。如果安装中遇到权限方面的错误,请确保cmd命令行工具是通过管理员身份运行的。安装成功后,执行以下命令:

npm install underscore

返回:

underscore@1.2.2 ./node_modules/underscore

如此,Windows平台下的NPM安装完毕,然后我们可以安装mongoose

npm install mongoose

实例
一些基础的操作,说明都写在代码注释里了:

// mongoose 链接
var mongoose = require('mongoose');
var db    = mongoose.createConnection('mongodb://127.0.0.1:27017/NodeJS'); 
// 链接错误
db.on('error', function(error) {
  console.log(error);
});
// Schema 结构
var mongooseSchema = new mongoose.Schema({
  username : {type : String, default : '匿名用户'},
  title  : {type : String},
  content : {type : String},
  time   : {type : Date, default: Date.now},
  age   : {type : Number}
});
// 添加 mongoose 实例方法
mongooseSchema.methods.findbyusername = function(username, callback) {
  return this.model('mongoose').find({username: username}, callback);
}
// 添加 mongoose 静态方法,静态方法在Model层就能使用
mongooseSchema.statics.findbytitle = function(title, callback) {
  return this.model('mongoose').find({title: title}, callback);
}
// model
var mongooseModel = db.model('mongoose', mongooseSchema);
// 增加记录 基于 entity 操作
var doc = {username : 'emtity_demo_username', title : 'emtity_demo_title', content : 'emtity_demo_content'};
var mongooseEntity = new mongooseModel(doc);
mongooseEntity.save(function(error) {
  if(error) {
    console.log(error);
  } else {
    console.log('saved OK!');
  }
  // 关闭数据库链接
  db.close();
});
// 增加记录 基于model操作
var doc = {username : 'model_demo_username', title : 'model_demo_title', content : 'model_demo_content'};
mongooseModel.create(doc, function(error){
  if(error) {
    console.log(error);
  } else {
    console.log('save ok');
  }
  // 关闭数据库链接
  db.close();
});
// 修改记录
mongooseModel.update(conditions, update, options, callback);
var conditions = {username : 'model_demo_username'};
var update   = {$set : {age : 27, title : 'model_demo_title_update'}};
var options  = {upsert : true};
mongooseModel.update(conditions, update, options, function(error){
  if(error) {
    console.log(error);
  } else {
    console.log('update ok!');
  }
  //关闭数据库链接
  db.close();
});
// 查询
// 基于实例方法的查询
var mongooseEntity = new mongooseModel({});
mongooseEntity.findbyusername('model_demo_username', function(error, result){
  if(error) {
    console.log(error);
  } else {
    console.log(result);
  }
  //关闭数据库链接
  db.close();
});
// 基于静态方法的查询
mongooseModel.findbytitle('emtity_demo_title', function(error, result){
  if(error) {
    console.log(error);
  } else {
    console.log(result);
  }
  //关闭数据库链接
  db.close();
});
// mongoose find
var criteria = {title : 'emtity_demo_title'}; // 查询条件
var fields  = {title : 1, content : 1, time : 1}; // 待返回的字段
var options = {};
mongooseModel.find(criteria, fields, options, function(error, result){
  if(error) {
    console.log(error);
  } else {
    console.log(result);
  }
  //关闭数据库链接
  db.close();
});
// 删除记录
var conditions = {username: 'emtity_demo_username'};
mongooseModel.remove(conditions, function(error){
  if(error) {
    console.log(error);
  } else {
    console.log('delete ok!');
  }

  //关闭数据库链接
  db.close();
});
Javascript 相关文章推荐
node.js中的url.format方法使用说明
Dec 10 Javascript
JS实现的左侧竖向滑动菜单效果代码
Oct 19 Javascript
基于jquery实现轮播特效
Apr 22 Javascript
angular+ionic 的app上拉加载更新数据实现方法
Jan 16 Javascript
Web 开发中Ajax的Session 超时处理方法
Jan 19 Javascript
利用原生JS与jQuery实现数字线性变化的动画
Feb 24 Javascript
js自定义Tab选项卡效果
Jun 05 Javascript
vue实现的仿淘宝购物车功能详解
Jan 27 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
Jun 13 Javascript
JS document内容及样式操作完整示例
Jan 14 Javascript
js表达式与运算符简单操作示例
Feb 15 Javascript
浅谈js中的attributes和Attribute的用法与区别
Jul 16 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
JS实现Select的option上下移动的方法
Mar 01 #Javascript
You might like
php使用imagecopymerge()函数创建半透明水印
2018/01/25 PHP
PHP的mysqli_set_charset()函数讲解
2019/01/23 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
PHP用swoole+websocket和redis实现web一对一聊天
2019/11/05 PHP
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
js中将具有数字属性名的对象转换为数组
2011/03/06 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
2011/10/23 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
vue权限问题的完美解决方案
2019/05/08 Javascript
React+TypeScript+webpack4多入口配置详解
2019/08/08 Javascript
js实现缓动动画
2020/11/25 Javascript
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
Python爬取国外天气预报网站的方法
2015/07/10 Python
关于numpy中eye和identity的区别详解
2019/11/29 Python
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
Linux Interview Questions For software testers
2012/06/02 面试题
动物学专业毕业生求职信
2013/10/11 职场文书
优秀学生事迹材料
2014/02/08 职场文书
出纳员岗位职责
2014/03/13 职场文书
节水倡议书范文
2014/04/15 职场文书
节约用水倡议书
2014/04/16 职场文书
幼儿园六一亲子活动方案
2014/08/26 职场文书
学生实习证明模板汇总
2014/09/25 职场文书
教师三严三实心得体会
2014/10/11 职场文书
2015秋季幼儿园开学寄语
2015/03/25 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
联谊活动总结范文
2015/05/09 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
《惊弓之鸟》教学反思
2016/02/20 职场文书
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技