写在前面

最近读《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. 第一课 1) 控制div属性 总结

    点击按钮变换属性: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  2. 西电2017ACM网络赛

    #include<bits/stdc++.h> using namespace std; typedef long long LL; #define ms(a,x) memset(a,x, ...

  3. 使用Publish Over SSH插件实现远程自动部署

    背景: 现场的部署环境开放外网环境困难,只有一台机器能够开发外网,应对该情况,所有的补丁文件需要直接在master机器上面生成,然后命令移动到其他的服务器上面去. 这里使用到了jenkins的Publ ...

  4. Windows查看端口使用状况

    使用端口是我们在进行远程或者打印机等都会遇到的,但是有很多用户会遇到端口被占用的情况,遇到这样的问题首先就要找出电脑中的所以端口然后进行查看,还是有很多人不知道该如何查看电脑端口. 1 查看windo ...

  5. C++写#pragma warning(disable 4786)的作用

    C++编程时,在使用STL(C++标准模板库)的时候经常引发类似的错误,尤其是vector,map这类模板类,模板中套模板,一不小心就很长了. 当命名超过C++规定范围255字符时,就会产生这个名为d ...

  6. Web项目、Http协议简介

    Web 静态web项目 静态web项目就是一个文件夹.静态Web项目 就是文件夹中都是静态资源. 如何将web项目部署到tomcat? 将web项目的文件夹复制到webapps目录下.比如把test文 ...

  7. Grass Cownoisseur[Usaco2015 Jan]

    题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-w ...

  8. mybatis 详解(四)------properties以及别名定义

    上一篇博客我们介绍了mybatis的增删改查入门实例,我们发现在 mybatis-configuration.xml 的配置文件中,对数据库的配置都是硬编码在这个xml文件中,如下图,那么我们如何改进 ...

  9. JavaScript之Object拆解

    转载烦请注明原文链接: https://github.com/Xing-Chuan/blog/blob/master/JavaScript/JavaScript%E4%B9%8BObject%E6%8 ...

  10. BFS:noi6044鸣人与佐助

    PS:一道XX到我心态崩溃的好(傻逼)题. 先粘题目: 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过 ...