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

[经验分享] Nodejs学习笔记(十)--- 与MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门

[复制链接]

尚未签到

发表于 2015-7-5 12:53:10 | 显示全部楼层 |阅读模式
目录




  • 简介
  • MongoDB安装(windows)
  • MongoDB基本语法和操作入门(mongo.exe客户端操作)

    • 库操作
    • 插入
    • 查询
    • 修改
    • 删除
    • 存储过程


  • nodejs操作MongoDB

    • 插入
    • 查询
    • 修改
    • 删除
    • 调用存储过程


  • 写在之后...

简介
    MongoDB
  开源,高性能的NoSQL数据库;支持索引、集群、复制和故障转移、各种语言的驱动程序;高伸缩性;
  NoSQL毕竟还处于发展阶段,也有说它的各种问题的:http://coolshell.cn/articles/5826.html
  官网地址:http://www.mongodb.org/
  API Docs:http://docs.mongodb.org/manual/
    node-mongodb-native
  mongodb的nodejs驱动;
  GitHub地址:https://github.com/mongodb/node-mongodb-native

MongoDB安装(windows)
  官方安装说明: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/
  按照官方说明在win7 64位环境下配置还是遇到了问题,我还是把我安装配置的过程写一下
  
  下载MongoDB并安装
  下载地址:http://www.mongodb.org/downloads
    创建数据库和日志存放目录
  在C盘根目录下新建“M_DB”和“M_LOG”两个文件夹,分别存放数据库文件和日志文件
    创建一个config文件
  打开目录“C:\Program Files\MongoDB 2.6 Standard\bin”,并在此目录下新建一个mongo.config文件,文件内容如下



##数据库目录
dbpath=C:\M_DB
##日志输出文件
logpath=C:\M_LOG\mongodb.log
    添加环境变量
  在环境变量PATH中加入“C:\Program Files\MongoDB 2.6 Standard\bin“
    以Windows服务器运行MongoDB
  以管理员方式打开CMD窗口,运行如下命令安装MongoDB服务,可以在 “控制面板\所有控制面板项\管理工具\服务”找到名为“MongoDB”的服务右键启动



mongod --config "C:\Program Files\MongoDB 2.6 Standard\bin\mongo.config" --install
    启动服务
  在CMD窗口中运行如下命令,也可以在可以在 “控制面板\所有控制面板项\管理工具\服务”



net start mongodb
    测试连接
  在CMD中运行如下命令,查看结果



mongo
DSC0000.png
    安装成功!
  
  最后两步非必需;MongoDB默认端口是27017,可以修改!
  
  对于“C:\Program Files\MongoDB 2.6 Standard\bin”目录下的exe程序,做个简单的说明,可能更利于了解可以做些什么操作,基础学习关注mongod.exe和mongo.exe即可
  mongo.exe:客户端,支持js语法
  mongod.exe:服务端
  mongodump.exe:备份工具
  mongorestore.exe:恢复工具
  mongoexport.exe:导出工具
  mongoimport.exe:导入工具
  mongostat.exe:实时性能监控工具
  mongotop.exe:跟踪MongDB实例读写时间工具
  
  更多详细解释或操作可以查看:http://docs.mongodb.org/manual/reference/program/

MongoDB基本语法和操作入门(mongo.exe客户端操作)
  MongoDB已经安装好,下面先对MongoDB进行一个简单的入门,再用node-mongodb-native去操作MongoDB
  库操作
  新建数据库:第一步:use 新建数据库名;第二步:进行此库相关的操作;如果不进行第二步,该数据库不会被创建
  查看数据库:show dbs;
  新建表:db.createCollection('要新建的表名');
  查看当前数据库下表: show collections;
  删除当前数据库指定表:db.表名.drop();
  删除当前数据库:db.dropDatabase();
  
  示例操作如下图:
DSC0001.png
  1.默认为存在“admin”和“local”两个数据库;admin数据库是存放管理员信息的数据库,认证会用到;local是存放replication相关的数据;这两处本篇都没有涉及到;
  2.find();是个查询操作,后面会讲到,上面用到主要是为了演示use不存在的库后,进行相关操作会创建出这个库;
  3.MongoDB没有像MySQL或MSSQL等数据库这么严格的规定,不是非得要先建库、建表、建各种字段,以后的操作中慢慢的会体会到^_^!
  
  插入
  方法一:db.表名.insert(数据);
DSC0002.png
  1.从上图操作可以看出,没有去创建“tb1”表,其实通过插入操作也会自动创建
  2._id,是mongodb自已生成的,每行数据都会存在,默认是ObjectId,可以在插入数据时插入这个键的值(支持mongodb支持的所有数据类型)  
  方法二:db.表名.save(数据);
DSC0003.png   
  1.从上图操作可以看出,save也可达到insert一样的插入效果
  2._id可以自已插入
  3.一个表中不一定要字段都相同
  
    那它们有什么区别?
     DSC0004.png
  从图中操作就可以看出,虽然insert和save方法都可以插入数据,当默认的“_id”值已存在时,调用insert方法插入会报错;而save方法不会,会更新相同的_id所在行数据的信息
  
  查询  
  查询表中所有数据:db.表名.find();
  按条件查询(支持多条件):db.表名.find(条件);
  查询第一条(支持条件):db.表名.findOne(条件);
  限制数量:db.表名.find().limit(数量);
  跳过指定数量:db.表名.find().skip(数量);
DSC0005.png
  从上图中可以看出具体用法,批量插入默认数据我用了一个javascript语法循环;
  
  比较查询
  大于:$gt
  小于:$lt
  大于等于:$gte
  小于等于:$lte
  非等于:$ne
DSC0006.png
  上面看到了AND的关系,或者的关系应该怎么用?
  或者:$or
DSC0007.png
  


  in和not in查询(包含、不包含)

  $in

  $nin

   DSC0008.png   
  查询数量:db.表名.find().count();
  排序:db.表名.find().sort({"字段名":1});
  1:表示升序  -1:表示降序
  指定字段返回: db.表名.find({},{"字段名":0});  
  1:返回  0:不返回
DSC0009.png
  
  查询就讲到这里了,感觉查询示例一下讲不完,还有些高级查询,大家自行去了解一下吧^_^!
  
  修改
  前面save在_id字段已存在是就是修改操作,按指定条件修改语法如下
  db.表名.update({"条件字段名":"字段值"},{$set:{"要修改的字段名":"修改后的字段值"}});
DSC00010.png
  
  删除
  db.表名.remove(条件);
DSC00011.png
  
  存储过程
  创建存储过程:



db.system.js.save({_id:"存储过程ID",
value:function(参数){  
-- 逻辑主体;
return 返回;
}});               
  调用存储过程



db.eval("存储过程ID()");
DSC00012.png
  所有存储过程都存放在db.system.js中
  
  MongoDB基本操作就讲这么多了,基本够用,深入学习大家自已去看看API^_^!
  

nodejs操作MongoDB
  先用npm安装mongodb



npm install mongodb
  安装成功后,继续在上面操作创建的库和表中操作
  
   插入

DSC00013.png



DSC00014.gif DSC00015.gif


var MongoClient = require('mongodb').MongoClient;
var DB_CONN_STR = 'mongodb://localhost:27017/wilsondb1';   
var insertData = function(db, callback) {  
//连接到表  
var collection = db.collection('tb2');
//插入数据
var data = [{"name":'wilson001',"age":21},{"name":'wilson002',"age":22}];
collection.insert(data, function(err, result) {
if(err)
{
console.log('Error:'+ err);
return;
}     
callback(result);
});
}
MongoClient.connect(DB_CONN_STR, function(err, db) {
console.log("连接成功!");
insertData(db, function(result) {
console.log(result);
db.close();
});
});
示例源码  查询

DSC00016.png






var MongoClient = require('mongodb').MongoClient;
var DB_CONN_STR = 'mongodb://localhost:27017/wilsondb1';  
var selectData = function(db, callback) {  
//连接到表  
var collection = db.collection('tb2');
//查询数据
var whereStr = {"name":'wilson001'};
collection.find(whereStr).toArray(function(err, result) {
if(err)
{
console.log('Error:'+ err);
return;
}     
callback(result);
});
}
MongoClient.connect(DB_CONN_STR, function(err, db) {
console.log("连接成功!");
selectData(db, function(result) {
console.log(result);
db.close();
});
});
示例源码  修改

DSC00017.png






var MongoClient = require('mongodb').MongoClient;
var DB_CONN_STR = 'mongodb://localhost:27017/wilsondb1';   
var updateData = function(db, callback) {  
//连接到表  
var collection = db.collection('tb2');
//更新数据
var whereStr = {"name":'wilson001'};
var updateStr = {$set: { "age" : 100 }};
collection.update(whereStr,updateStr, function(err, result) {
if(err)
{
console.log('Error:'+ err);
return;
}     
callback(result);
});
}
MongoClient.connect(DB_CONN_STR, function(err, db) {
console.log("连接成功!");
updateData(db, function(result) {
console.log(result);
db.close();
});
});
示例源码  删除

DSC00018.png






var MongoClient = require('mongodb').MongoClient;
var DB_CONN_STR = 'mongodb://localhost:27017/wilsondb1';  
var delData = function(db, callback) {  
//连接到表  
var collection = db.collection('tb2');
//删除数据
var whereStr = {"name":'wilson001'};
collection.remove(whereStr, function(err, result) {
if(err)
{
console.log('Error:'+ err);
return;
}     
callback(result);
});
}
MongoClient.connect(DB_CONN_STR, function(err, db) {
console.log("连接成功!");
delData(db, function(result) {
console.log(result);
db.close();
});
});
示例源码  调用存储过程

DSC00019.png






var MongoClient = require('mongodb').MongoClient;
var DB_CONN_STR = 'mongodb://localhost:27017/wilsondb1';   
var invokeProcData = function(db, callback) {  
//存储过程调用
db.eval('get_tb2_count()', function(err, result) {
if(err)
{
console.log('Error:'+ err);
return;
}            
callback(result);
});
}
MongoClient.connect(DB_CONN_STR, function(err, db) {
console.log("连接成功!");
invokeProcData(db, function(result) {
console.log(result);
db.close();
});
});
示例源码  
  到此CRUD操作就完成,通过回调函数的result参数进行判断都可以进行业务逻辑的进一步组合!

写在之后...
  本篇针对node-mongodb-native操作MongoDB没有做更深的讲解,原因是针对它的进行再次封装的东西很多,且更利于编程实现,比如:mongoose、mongoskin、mongolian等等,应用性不错;
  mongoose的可能用的比较多...
  本文中很多地方我都还是习惯的用表、行等术语去描述,其实对NoSQL来说并不对,只是有助于习惯了关系型数据库的开发人员来解;
  文章中“表”本应该描述为“collection(集合)”;“行”应该描述为“文档(document)”,一个database中可以有多个collection,一个collection中又可以有多个document
  文章中并没有涉及认证的部分,大家自行去补一下,非常简单,我文中也挺到了两个默认数据库中的“admin”数据库
  用CMD中使用mongo.exe操作时,插入中文遇一了问题,原因是MongoDB默认编辑是utf-8,而CMD是GBK,所以在CMD窗口中执行这个命令修改编辑即可:chcp 65001
  注意mongodb严格区分大小写,比如查询 db.tb2.find({"name":"wilson0"})和 db.tb2.find({"Name":"wilson0"}) 并不是用的同一字段做的条件;
  
  主要参考资料:
  http://docs.mongodb.org/manual/
  https://github.com/mongodb/node-mongodb-native
  MongoDB权威指南

运维网声明 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-83358-1-1.html 上篇帖子: [nodejs]解决mysql和连接池(pool)自动断开问题 下篇帖子: 大熊君大话NodeJS之------MongoDB模块(额外篇)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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