详解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 相关文章推荐
js与运算符和或运算符的妙用
Feb 14 Javascript
Jquery动态添加及删除页面节点元素示例代码
Jun 16 Javascript
JavaScript中SetInterval与setTimeout的用法详解
Nov 10 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
May 05 Javascript
JS实现图片上传预览功能
Nov 21 Javascript
理解javascript中的Function.prototype.bind的方法
Feb 03 Javascript
ReactNative短信验证码倒计时控件的实现代码
Jul 20 Javascript
基于vue中css预加载使用sass的配置方式详解
Mar 13 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
Dec 29 Javascript
vue+elementUi图片上传组件使用详解
Aug 20 Javascript
vue项目出现页面空白的解决方案
Oct 31 Javascript
Vue获取页面元素的相对位置的方法示例
Feb 05 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
用PHP4访问Oracle815
2006/10/09 PHP
PHP文件注释标记及规范小结
2012/04/01 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
Open and Print a Word Document
2007/06/15 Javascript
ExtJs扩展之GroupPropertyGrid代码
2010/03/05 Javascript
jquery json 实例代码
2010/12/02 Javascript
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
javascript动态创建表格及添加数据实例详解
2015/05/13 Javascript
一览画面点击复选框后获取多个id值的方法
2016/05/30 Javascript
JavaScript知识点总结(五)之Javascript中两个等于号(==)和三个等于号(===)的区别
2016/05/31 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
Angular Module声明和获取重载实例代码
2016/09/14 Javascript
Vue.js实现简单ToDoList 前期准备(一)
2016/12/01 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
angularjs $http调用接口的方式详解
2018/08/13 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
python中enumerate的用法实例解析
2014/08/18 Python
Python爬取京东的商品分类与链接
2016/08/26 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
Python实现生成密码字典的方法示例
2019/09/02 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
Python enumerate内置库用法解析
2020/02/24 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
详解CSS3中使用gradient实现渐变效果的方法
2015/08/18 HTML / CSS
通过CSS3的object-fit来调整图片适配尺寸的技巧简介
2016/02/27 HTML / CSS
PHP如何自定义函数
2016/09/16 面试题
2015民办小学年度工作总结
2015/05/26 职场文书
航班延误投诉信
2015/07/02 职场文书
推广普通话主题班会
2015/08/17 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python
MySQL Router的安装部署
2021/04/24 MySQL
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android
Oracle中DBLink的详细介绍
2022/04/29 Oracle