详解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 相关文章推荐
javascript 有用的脚本函数
May 07 Javascript
jQuery 第二课 操作包装集元素代码
Mar 14 Javascript
javascript函数自动执行常用方法汇总
Mar 28 Javascript
深入解析JavaScript中的arguments对象
Jun 12 Javascript
Javascript实现前端简单的路由实例
Sep 11 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
Dec 12 Javascript
JS实现的五级联动菜单效果完整实例
Feb 23 Javascript
jquery实现弹窗功能(窗口居中显示)
Feb 27 Javascript
bootstrap-table组合表头的实现方法
Sep 07 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
Aug 08 Javascript
解决angularJS中input标签的ng-change事件无效问题
Sep 13 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
Jul 19 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 foreach循环中使用引用的问题
2013/11/06 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
使用javascipt---实现二分查找法
2013/04/10 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
2018/03/08 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
2018/07/13 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
Vue中的this.$options.data()和this.$data用法说明
2020/07/26 Javascript
python打开网页和暂停实例
2014/09/30 Python
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
Python中断言Assertion的一些改进方案
2016/10/27 Python
使用python读取txt文件的内容,并删除重复的行数方法
2018/04/18 Python
3种python调用其他脚本的方法
2020/01/06 Python
Python 字典一个键对应多个值的方法
2020/09/29 Python
python基于pexpect库自动获取日志信息
2021/02/01 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
纯css3制作煽动翅膀的蝴蝶的示例
2018/04/23 HTML / CSS
草莓网官网:StrawberryNET
2019/08/21 全球购物
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
校园安全广播稿
2014/02/08 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
会议室标语
2014/06/21 职场文书
解放思想演讲稿
2014/09/11 职场文书
2015年社区妇联工作总结
2015/04/21 职场文书