详解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 相关文章推荐
cument.execCommand()用法深入理解
Dec 04 Javascript
禁止按回车键提交表单的方法
Jun 11 Javascript
js实现简单排列组合的方法
Jan 27 Javascript
纯JavaScript代码实现文本比较工具
Feb 17 Javascript
JavaScript事件学习小结(三)js事件对象
Jun 09 Javascript
让div运动起来 js实现缓动效果
Jul 06 Javascript
angularjs实现过滤并替换关键字小功能
Sep 19 Javascript
vue在使用ECharts时的异步更新和数据加载详解
Nov 22 Javascript
深入剖析Express cookie-parser中间件实现示例
Feb 01 Javascript
微信小程序的引导页实现代码
Jun 24 Javascript
JavaScript对象访问器Getter及Setter原理解析
Dec 08 Javascript
React如何创建组件
Jun 27 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
Yii2隐藏frontend/web和backend/web的方法
2015/12/12 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
Javascript hasOwnProperty 方法 & in 关键字
2008/11/26 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
javascript实现yield的方法
2013/11/06 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
Knockoutjs 学习系列(二)花式捆绑
2016/06/07 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
React手稿之 React-Saga的详解
2018/11/12 Javascript
Vue实现导航栏的显示开关控制
2019/11/01 Javascript
详解Vscode中使用Eslint终极配置大全
2019/11/08 Javascript
webpack常用配置总览(小结)
2019/11/18 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
2020/06/22 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
详解Vue2的diff算法
2021/01/06 Vue.js
基于python的ini配置文件操作工具类
2019/04/24 Python
python实现人机五子棋
2020/03/25 Python
计算机毕业大学生推荐信
2013/12/01 职场文书
无工作经验者个人求职信范文
2013/12/22 职场文书
爱情保证书范文
2014/02/01 职场文书
xxx同志考察材料
2014/02/07 职场文书
优秀学生事迹材料
2014/02/08 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
单位委托书怎么写
2014/08/02 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
办公用房租赁协议书
2014/11/29 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL
四十九个javascript小知识实用技巧
2021/11/20 Javascript