详解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 相关文章推荐
JQuery 解析多维的Json数据格式
Nov 02 Javascript
Chosen 基于jquery的选择框插件使用方法
May 30 Javascript
Javascript代码在页面加载时的执行顺序介绍
May 03 Javascript
利用原生JavaScript获取元素样式只是获取而已
Oct 08 Javascript
jQuery中:contains选择器用法实例
Dec 30 Javascript
js获取域名的方法
Jan 27 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
Jun 01 Javascript
JavaScript中的原型prototype完全解析
May 10 Javascript
基于JavaScript实现无限加载瀑布流
Jul 21 Javascript
layui的table单击行勾选checkbox功能方法
Aug 14 Javascript
JQuery扩展对象方法操作示例
Aug 21 jQuery
Vue数字输入框组件示例代码详解
Jan 15 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设计模式之调解者模式的深入解析
2013/06/13 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
thinkphp3.2同时连接两个数据库的简单方法
2019/08/13 PHP
jQuery 解析xml文件
2009/08/09 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
网页编辑器ckeditor和ckfinder配置步骤分享
2012/05/24 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
js脚本分页代码分享(7种样式)
2015/08/19 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
在小程序中使用canvas的方法示例
2018/09/17 Javascript
vue自定义指令的创建和使用方法实例分析
2018/12/04 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
2019/06/18 Javascript
Vue 使用计时器实现跑马灯效果的实例代码
2019/07/11 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
javaScript实现一个队列的方法
2020/07/14 Javascript
跟老齐学Python之一个免费的实验室
2014/09/14 Python
使用PDB简单调试Python程序简明指南
2015/04/25 Python
python多线程方式执行多个bat代码
2016/06/07 Python
Python实现备份MySQL数据库的方法示例
2018/01/11 Python
Python+OpenCV目标跟踪实现基本的运动检测
2018/07/10 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
2020/01/21 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
2020/11/02 Python
python requests库的使用
2021/01/06 Python
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
C# Debug和Testing相关面试题
2015/10/25 面试题
什么是servlet
2012/05/08 面试题
大专毕业生求职信
2014/07/05 职场文书
新学期家长寄语2016
2015/12/03 职场文书
python编写函数注意事项总结
2021/03/29 Python
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python