写在前面

最近读《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 Native Node.js Driver的更多相关文章

  1. MongoDB Node.js driver

    Node.js连接MongoDB的简单实例 安装Node.js driver npm install mongodb -save 连接 var MongodbClient = require('mon ...

  2. mongodb shell和Node.js driver使用基础

    开始: Mongo Shell 安装后,输入mongo进入控制台: //所有帮助 > help //数据库的方法 > db.help() > db.stats() //当前数据库的状 ...

  3. mongodb & vue & node.js

    mongodb mongodb & vue & node.js https://docs.mongodb.com/manual/tutorial/install-mongodb-on- ...

  4. 2.MongoDB 基于node.js访问和操作集合

    对于频繁使用的Node.js来说,常见的任务是集合的动态操控. 较大的安装给每个大客户一个单独的集合,以便客户登入或离开时.根据需要添加或删除集合. MongoDB Node.js 驱动程序 Db和C ...

  5. windows下安装mongodb以及node.js连接mongodb

    一.MongoDB 下载 下载地址  https://www.mongodb.com/download-center#community  选择windows版下载,然后安装. 二.安装完毕后创建数据 ...

  6. MongoDB 搭建Node.js开发环境

    理解Mongoose Elegant MongoDB object modeling for Node.js   安装Mongoose   $ cnpm install --save mongoose ...

  7. 获得 MongoDB for Node.js Developers 证书

    前段时间由于项目需要,开始学习MongoDB,发现MongoDB官网的学习课程非常有帮助. 整个教学很有体系,包括: Video.quiz.Homework.Final Exam. 历时7周,拿到认证 ...

  8. mongodb原生node驱动

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

  9. Node.js开发——MongoDB与Mongoose

    为了保存网站的用户数据和业务数据,通常需要一个数据库.MongoDB和Node.js特别般配,因为MongoDB是基于文档的非关系型数据库,文档是按BSON(JSON的轻量化二进制格式)存储的,增删改 ...

随机推荐

  1. 如何删除svn标签

    SVN是Subversion的简称,是一个开放源代码的版本控制系统,对于多人共同开发同一个项目非常有用,但有一点比较让人头疼,那就是项目移植的时候,原来的文件夹带有很多可恶的svn标签,使其不能add ...

  2. SQL Server2008 安装及概述

    最近在学习SQL Server 数据库,用的版本是2008 R2的版本,如下图所示,本人学习时间不长,写这篇文章一是为了锻炼自己加深印象,二也可以与和诸多朋友进行交流以及得到大家的指教. 安装教程网上 ...

  3. (转)IBM MQ 创建以及常见问题集锦

    背景:这篇文章还是很全面的,但是很杂乱 后面慢慢整理吧! 1 MQ 消息队列+发送队列+消息通道 接收通道名称与发送端的发送通道名称要一致,修改通道信息后要执行 start channle(chlna ...

  4. 将bbr功能合入到centos7.3

    今天将bbr的算法合入到了centos7.3的内核,基线内核版本是3.10.0-514.el7.x86_64, 内核编译测试通过.感谢隆春和文洋的帮助,隆春是将bbr合入到了cgslv5版本. 这种反 ...

  5. iOS开发 MVVM+RAC 的使用

    好长一段时间没有敲简书了! 主要是因为一直在跑面试. 终于还是在上海入职了! 由于项目原因最终还是入了MVVM+RAC的坑 下面是正题. Demo效果 使用MVVM+RAC请求网络数据 Reactiv ...

  6. 计算机网络之应用层_part -1

    应用层协议原理 一.网络应用程序体系结构 网络应用程序体系结构是由程序研发者设计的,规定了如何在各种端系统中组织该应用程序,主要流行的有两种: 1.客户--服务器体系结构: 有一个总是打开的主机(称为 ...

  7. javascript中this的用法

    this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ this.x = 1; } 随着函数使用场合的 ...

  8. vue获取下拉框值

    vue获取下拉框的值,用vue-modle,只有点击下拉框的值才会赋值到下拉框中,初始时下拉框没有数据,而改用$event就不会出现这样的问题,下面看代码以及图解: v-model解决方式: < ...

  9. Git的一些知识

    Git Git的特点: Git存储的是文件快照, 即整个文件内容, 并保存指向快照的索引 分布式 原理 这个之前面试实习的时候被问到过, 搞懂基本原理还是很重要的 Git的目录结构在执行git ini ...

  10. 6. leetcode 136. Single Number

    Given an array of integers, every element appears twice except for one. Find that single one. Note: ...