设为首页 收藏本站
查看: 1333|回复: 0

[经验分享] okaychen那兔:我们的征途是星辰大海

[复制链接]

尚未签到

发表于 2017-12-14 22:57:25 | 显示全部楼层 |阅读模式
写在前面
  最近读《node.js学习指南》,对于mongodb没有介绍太多的工作原理,但是对于一个前端开发者,即使你还没有用过这种数据库也可以让你很好的理解和使用
DSC0000.png

  一本非常好的介绍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数据库,并添加文档了,这对于一个大二的前端开发小伙伴来说是兴奋地,以至于半夜不睡觉发神经扰民- -
  

1 var mongodb = require('mongodb');  

2  
3 var server = new mongodb.Server('localhost', 27017, {auto_reconnect: true});
  
4 var db = new mongodb.Db('exampleDb', server);
  
5
  
6 db.open(function (err, db) {
  
7     if (!err) {
  
8         db.collection('widgets', function (err, collection) {
  
9             //删除exampleDb数据库widgets集合中的数据
  
10             collection.remove(null, {safe: true}, function (err, result) {
  
11                 if (!err) {
  
12                     console.log('result of remove' + result);
  
13                     //创建两条数据

  
14                     var widget1 = {id: 1,>  
15                     var widget2 = {

  
16                        >
  
17                        >  
18                         desc: 'second greatest widget of all',
  
19                         price: 29.99
  
20                     };
  
21                     collection.insert(widget1);
  
22                     collection.insert(widget2, {safe: true}, function (err, result) {
  
23                         if (err) {
  
24                             console.log(err)
  
25                         } else {
  
26                             collection.find().toArray(function (err, docs) {
  
27                                 console.log(docs);
  
28                                 //关闭数据库
  
29                                 db.close();
  
30                             });
  
31                         }
  
32                     })
  
33                 }
  
34             })
  
35         })
  
36     }
  
37 });
  

  进入到项目文件,我们通过node命令启动app服务: node app ,
  当然你如果你想避免每次修改之后通过node命令重启服务的繁琐,可以使用supervisor,通过 npm install supervisor -g 安装在全局中,使用supervisor命令代替node,这样修改文件之后,不需要每次通过node命令重启服务
  那么我们在命令行看下结果吧- -
DSC0001.png

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

  会看到数据库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
  

1 var mongodb = require('mongodb');  

2  
3 var server = new mongodb.Server('localhost', 27017, {auto_reconnect: true});
  
4 var db = new mongodb.Db('exampleDb', server);
  
5
  
6 db.open(function (err, db) {
  
7     if (!err) {
  
8         db.collection('widgets', function (err, collection) {
  
9             //更新数据
  
10             collection.update({id: 2}, {$set: {title: "Super Bad Widget"}}, {safe: true}, function (err, result) {
  
11                 if (err) {
  
12                     console.log(err)
  
13                 } else {
  
14                     console.log(result);
  
15                     //查询更新数据库
  
16                     collection.findOne({id: 2}, function (err, doc) {
  
17                         if (!err) {
  
18                             console.log(doc);
  
19                             //关闭数据库
  
20                             db.close();
  
21                         }
  
22                     })
  
23                 }
  
24             })
  
25         })
  
26     }
  
27 });
  

  更新后的数据库已经改变


写在后面
  使用MongoDB Native Node.js Driver模块,驱动的指令基本上和mongodb客户端是一致的,如果你跟我一样对原始的驱动模块感兴趣,那么这个nodeJS Driver官网一定可以帮到你。
  虽然原始驱动提供了数据库的连接,但是缺少更高级别的抽象,有些繁琐,所以有时候你需要使用类似mongoose的ODM,
  mongoose构建在mongodb之上,提供了Schema、Model和Document对象,用起来更为方便。
  下一次我会总结一下使用express + mongoose建立数据库的连接

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-424185-1-1.html 上篇帖子: MongoDB用户角色配置 下篇帖子: python数据抓取分析(python + mongodb)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表