mongodb原生node驱动
写在前面
最近读《node.js学习指南》,对于mongodb没有介绍太多的工作原理,但是对于一个前端开发者,即使你还没有用过这种数据库也可以让你很好的理解和使用

一本非常好的介绍node.js的书,我一直把他放在触手可及的地方。 --Mike Amundsen
MongoDB Native Node.js Driver模块是mongodb自带的node的驱动,这个驱动发出的mongodb指令和mongodb客户端发出的指令基本一致。
准备开始- -
1、首先我们应该确保我们的mongodb数据库本地安装可以正常运行,如果安装过程到遇到了问题可以简单参考我的上一篇博客(window下mongodb的配置与安装)
2、然后我们需要新建一个项目<nodeLearn> mkdir nodeLearn ,创建一个app.js文件作为项目启动文件。
3、然后我们需要在项目文件中安装MongoDB Native Node.js Driver: npm install mongodb
4、开始
1)引入模块,使用mongodb驱动,创建mongodb.Server对象来建立数据库的连接:
var mongodb = require('mongodb')
var server = new mongodb.Server('localhost',27017,{auto_reconnect:true })
注:Server构造函数的前两个参数分别是localhost和27017默认端口,第三个参数可选,选项被设置为true,表示如果连接断开driver会自动进行重连(还有一个参数pollSize,决定并发的TCP连接数量,我还没有接触到= =)。
2)使用mongodb.Db对象创建数据库
var db = new mongodb.Db('mydb',server)
注:第二个参数表示建立已经连接好的Mongodb server
Mongodb Collection
在MongoDB中并没有表的概念,我们需要一个集合.
1、在数据库中创建一个collection集合对象
db.createCollection('mycollection',function(err,collection){ })
db.collection('mycollection',function(err,collection){ })
注:使用create和不使用有一些区别,使用create表示立即创建,如果对一个已经存在的collection使用createcollection方法,也可以直接访问该collection-driver,并不会覆盖。不使用create并没有创建实际的collection.
2、在数据库中彻底销毁一个collection
db.dropCollection('mycollection',function(err,result){ })
为collection添加数据
在添加数据之前,我们要知道node mongodb driver 与mongodb数据类型存在一种映射关系(但是对于数据转换背后的处理机制我还不是理解的很清楚,这里为之后的一篇博客做伏笔- -)
添加数据:
1、先用remove方法删除已有的collection文档以防止创建失败,
2、使用insert方法插入数据(接受三个参数,safe模式,keepGoing【插入失败是否继续执行】、serializeFunctions【是否序列化】)
到这里我们已经可以连接到我们的mongodb数据库,并添加文档了,这对于一个大二的前端开发小伙伴来说是兴奋地,以至于半夜不睡觉发神经扰民- -
var mongodb = require('mongodb');
var server = new mongodb.Server('localhost', 27017, {auto_reconnect: true});
var db = new mongodb.Db('exampleDb', server);
db.open(function (err, db) {
if (!err) {
db.collection('widgets', function (err, collection) {
//删除exampleDb数据库widgets集合中的数据
collection.remove(null, {safe: true}, function (err, result) {
if (!err) {
console.log('result of remove' + result);
//创建两条数据
var widget1 = {id: 1, title: 'First Great widget', desc: 'greatest widget of all', price: 14.99};
var widget2 = {
id: 2,
title: 'Second Great widget',
desc: 'second greatest widget of all',
price: 29.99
};
collection.insert(widget1);
collection.insert(widget2, {safe: true}, function (err, result) {
if (err) {
console.log(err)
} else {
collection.find().toArray(function (err, docs) {
console.log(docs);
//关闭数据库
db.close();
});
}
})
}
})
})
}
});
进入到项目文件,我们通过node命令启动app服务: node app ,
当然你如果你想避免每次修改之后通过node命令重启服务的繁琐,可以使用supervisor,通过 npm install supervisor -g 安装在全局中,使用supervisor命令代替node,这样修改文件之后,不需要每次通过node命令重启服务
那么我们在命令行看下结果吧- -

然后我们在mongodb数据库中看下数据结果:(如果你已经配置好了mongo的环境变量,以管理员身份打开cmd,通过mongo命令启动mongodb)

会看到数据库widgets文档中也加入了我们想要的两条数据,
如果批量处理文档数据,我们需要尽可能的设置keepGoing为true。
实现查询数据
对于MongoDB Native Node.js Driver来说有四种查询数据的方法:find()、findOne()、findAndRemove()、findAndModify()
findOne()和find()支持以下三个参数:查询数据、可选参数、回调函数 。(对于可选参数和回调函数都是可选项、而且这两种选项的可选值非常多,但是大部分查询只会用到一小部分的选项值)
常用的 sort(文档排序,-1倒排序,1正排序)、
Field(查询语句并返回field)、
Skip(skip n个文档,用于跳页)
Hint(告诉数据库使用特定的索引)
returnKey(只返回索引的key)
Comment(为查询在log日志文件中添加描述)
showDiscLoc(显示结果在磁盘中的位置)...
这些选项值我们同样可以在mongo下使用,进行数据的一些操作
1、接下来我们来用find()查询并返回我们数据库的内容,可以直接使用toArray()方法将结果转化为数组
2、使用可选值field来进行筛选,{fields:{ type=0 }} 设置为0来查询除type之外的字段,为1相反
collection.find({type="A"},{fields:{type=0}}).toArray(function(err,docs){
if(err){
console.log(err)
}else{
console.log(docs);
//关闭数据库链接
db.close();
}
})
我们来找到所有type为A,并且返回这条数据(不含type字段)。但是需要注意的一点是,我们设置为1,也并不是只出现type字段,系统生成的唯一标识符也就是_id总是会出现在查询结果中
更新、删除文档
修改、删除文档的方法:更新文档:update() 或者是upserts(如果不存在就添加文档),删除文档remove()、查找并修改或者删除一个文档findAndModify()、查找并删除一个文档findAndRemove()
update/remove和后两个方法之间最本质的区别就在于后者两个方法都返回了被操作的文档
使用$set修改符代替field,$set修改符使只会修改作为属性传递给修改器的field
var mongodb = require('mongodb');
var server = new mongodb.Server('localhost', 27017, {auto_reconnect: true});
var db = new mongodb.Db('exampleDb', server);
db.open(function (err, db) {
if (!err) {
db.collection('widgets', function (err, collection) {
//更新数据
collection.update({id: 2}, {$set: {title: "Super Bad Widget"}}, {safe: true}, function (err, result) {
if (err) {
console.log(err)
} else {
console.log(result);
//查询更新数据库
collection.findOne({id: 2}, function (err, doc) {
if (!err) {
console.log(doc);
//关闭数据库
db.close();
}
})
}
})
})
}
});
更新后的数据库已经改变

写在后面
使用MongoDB Native Node.js Driver模块,驱动的指令基本上和mongodb客户端是一致的,如果你跟我一样对原始的驱动模块感兴趣,那么这个nodeJS Driver官网一定可以帮到你。
虽然原始驱动提供了数据库的连接,但是缺少更高级别的抽象,有些繁琐,所以有时候你需要使用类似mongoose的ODM,
mongoose构建在mongodb之上,提供了Schema、Model和Document对象,用起来更为方便。
下一次我会总结一下使用express + mongoose建立数据库的连接
mongodb原生node驱动的更多相关文章
- MongoDB Native Node.js Driver
写在前面 最近读<node.js学习指南>,对于mongodb没有介绍太多的工作原理,但是对于一个前端开发者,即使你还没有用过这种数据库也可以让你很好的理解和使用 一本非常好的 ...
- NW.js安装原生node模块node-printer控制打印机
1.安装原生node模块 #全局安装nw-gyp npm install -g nw-gyp #设置目标NW.js版本 set npm_config_target=0.31.4 #设置构建架构,ia3 ...
- MongoDB Python官方驱动 PyMongo 的简单封装
最近,需要使用 Python 对 MongodB 做一些简单的操作,不想使用各种繁重的框架.出于可重用性的考虑,想对 MongoDB Python 官方驱动 PyMongo 做下简单封装,百度一如既往 ...
- [译] MongoDB Java异步驱动快速指南
导读 mongodb-java-driver是mongodb的Java驱动项目. 本文是对MongoDB-java-driver官方文档 MongoDB Async Driver Quick Tour ...
- Mongodb的Samus驱动
最近开始学习Mongodb方面的东西.. 看到有很多博主都说MongoDB的第三方驱动 Samus 对Linq的支持比较好..能够降低学习的成本..所以就想从这里开始.. 但是弊端在我学习了一半的时候 ...
- MongoDB资料--Java驱动, Hadoop驱动, Spark使用
MongoDB数据库备份: mongodump -h 192.168.1.160 -d MapLoc -o /usr/local/myjar/mongo/MapLoc/数据库还原:mongoresto ...
- MongoDB的C#驱动
MongoDB的C#驱动基本使用 MongoDB的官方C#驱动可以通过这个链接得到.链接提供了.msi和.zip两种方式获取驱动dll文件. 通过这篇文章来介绍C#驱动的基本数据库连接,增删改查操作. ...
- node.js系列(实例):原生node.js+formidable模块实现简单的文件上传
/** * 原生node.js结合formidable模块实现图片上传改名 * @Author:Ghost * @Date:2016/07/15 * @description: * 1.引入模块htt ...
- node.js系列(实例):原生node.js实现接收前台post请求提交数据
前台界面: 前台代码: <form class="form-horizontal" method="post" action="http:127 ...
随机推荐
- 生活随记[All]
1. 心灵鸡汤[all] 2. 工作总结 [all] 3. 面试经验[all] 4. 其他
- DevExpress01:Bar Manager,bar 、Toolbars
Bar Manager : 不可见的控件 如果想在窗体或用户控件添加工具条或弹出菜单,我们需要把一个不可见的控件 BarManager拖放到这个窗体或用户控件上. 这个BarManager控件维护工具 ...
- PHP Redis 全部操作方法 转载
PHP Redis 全部操作方法 Classes and methods Usage Class Redis Class RedisException Predefined constants C ...
- iOS 开源库系列 Aspects核心源码分析---面向切面编程之疯狂的 Aspects
Aspects的源码学习,我学到的有几下几点 Objective-C Runtime 理解OC的消息分发机制 KVO中的指针交换技术 Block 在内存中的数据结构 const 的修饰区别 block ...
- golang-gorm框架支持mysql json类型
gorm框架目前不支持Json类型的数据结构 http://gorm.book.jasperxu.com/callbacks.html 如在Mysql中定义了如下的表结构 CREATE TABLE ` ...
- 使用transient关键字解决ehcache序列化错误
使用Ehcache时发现个不起眼的小问题 在一个Model中有以下代码: public class MyModel implements Serializable { private static f ...
- BZOJ1076:[SCOI2008]奖励关(状压DP,期望)
Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的 ...
- 【AT987】高橋君
题目 成爷爷一眼秒,\(tql!!!\) 多组询问,求 \[\sum_{i=0}^kC_{n}^i \] 发现\(k<=n\)啊,于是我们可以把一组询问抽象成一个区间\([k,n]\) 左指针的 ...
- TensorFlow函数(七)tf.argmax()
tf.argmax(input, dimension, name=None) 参数: input:输入数据 dimension:按某维度查找. dimension=0:按列查找: dimension= ...
- Java和Python安装和编译器使用
java 一.安装jdk时第二次选择安装目录时,这是在安装jre,可以直接取消. 二.配置三个环境变量(在WIN7下) 右键我的电脑>属性>高级系统设置>环境变量>系统变量. ...