zoukankan      html  css  js  c++  java
  • mongodb学习(2)--- nodeJS与MongoDB的交互(使用mongodb/node-mongodb-native)

    转载:http://www.cnblogs.com/zhongweiv/p/node_mongodb.html

    目录

    简介: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)参考前文nodeJS学习(7)--- WS开发 NodeJS 项目-节2 <安装&设置&启动 mongodb 数据库++遇到的问题>

    MongoDB基本语法和操作入门(mongo.exe客户端操作)

      MongoDB已经安装好,下面先对 MongoD B进行一个简单的入门,再用node-mongodb-native去操作MongoDB

     库操作

      新建数据库:第一步:use 新建数据库名;第二步:进行此库相关的操作;如果不进行第二步,该数据库不会被创建

    • 查看数据库:show dbs;
    • 新建表:db.createCollection('要新建的表名');
    • 查看当前数据库下表: show collections;
    • 删除当前数据库指定表:db.表名.drop();
    • 删除当前数据库:db.dropDatabase();

      示例操作如下图:

               

      1. 默认为存在“admin”和“local”两个数据库;admin数据库是存放管理员信息的数据库,认证会用到;local是存放replication相关的数据;这两处本篇都没有涉及到;

      2. find():是个查询操作,后面会讲到,上面用到主要是为了演示 use不存在的库后,进行相关操作会创建出这个库;

      3. MongoDB 没有像 MySQL 或 MSSQL 等数据库这么严格的规定,不是非得要先建库、建表、建各种字段,以后的操作中慢慢的会体会到^_^!

      

     插入

    • 方法一:db.表名.insert(数据);

      

      1.从上图操作可以看出,没有去创建“tb1”表,其实通过插入操作也会自动创建

      2._id,是mongodb自已生成的,每行数据都会存在,默认是ObjectId,可以在插入数据时插入这个键的值(支持mongodb支持的所有数据类型)  

    • 方法二:db.表名.save(数据);

         

      1.从上图操作可以看出,save也可达到insert一样的插入效果

      2._id可以自已插入

      3.一个表中不一定要字段都相同

      强调:那它们有什么区别?

      

      从图中操作就可以看出,

    虽然insert和save方法都可以插入数据,当默认的“_id”值已存在时,调用insert方法插入会报错;而save方法不会,会更新相同的_id所在行数据的信息!!

      查询  

    • 查询表中所有数据:db.表名.find();
    • 按条件查询(支持多条件):db.表名.find(条件); 
    • 查询第一条(支持条件):db.表名.findOne(条件);
    • 限制数量:db.表名.find().limit(数量);
    • 跳过指定数量:db.表名.find().skip(数量);

      

      从上图中可以看出具体用法,批量插入默认数据我用了一个 javascript 语法循环;

     

    • 比较查询
    大于:$gt
    小于:$lt
    大于等于:$gte
    小于等于:$lte
    非等于:$ne

         示例:

      

      上面看到了AND的关系(数组),或者的关系应该怎么用?

    • 或者:$or

      

    • in和not in查询(包含、不包含)  
    包含:  $in
    不包含: $nin
       
    • 查询数量:db.表名.find().count();
    • 排序:db.表名.find().sort({"字段名":1}); 
    1: 表示升序  
    -1:表示降序
    • 指定字段返回: db.表名.find({},{"字段名":0});  
    1:返回 
    0:不返回 # 如下: _id 不返回,即不显示 _id。

          示例:

       

      

      查询就讲到这里了,感觉查询示例一下讲不完,还有些高级查询,大家自行去了解一下吧^_^!

      

      修改

      前面 save 在 _id 字段已存在时,就是修改操作,按指定条件修改语法如下: 

    db.表名.update({"条件字段名":"字段值"},{$set:{"要修改的字段名":"修改后的字段值"}});

      示例:

      

      删除

      db.表名.remove(条件);

      

      存储过程

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

    示例:

      所有存储过程都存放在db.system.js中

      MongoDB基本操作就讲这么多了,基本够用,深入学习大家自已去看看API^_^!

    nodejs操作MongoDB

    • 先用npm安装mongodb
    npm install mongodb

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

    • 插入

       示例:使用 mongodb 访问数据库

    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();
        });
    });
    示例源码
    • 查询

     

    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();
      });
    });
    示例源码
    • 修改

    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();
        });
    });
    
    示例源码
    示例源码
    • 删除

    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();
      });
    });
    
    示例源码
    示例源码
    • 调用存储过程

    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没有做更深的讲解,原因是针对它的进行再次封装的东西很多,且更利于编程实现,比如:mongoosemongoskinmongolian等等,应用性不错;

      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

  • 相关阅读:
    培养你的领导气质
    头痛
    张颐武:周小平的意义
    浅谈第三方电子支付平台测试方法的研究
    java基础复习二——面向对象一
    jmeter内存溢出处理方式记录
    软件质量管理的八个法则
    CMM已经落伍了,敏捷才是王道
    空间管理 您的位置: 51Testing软件测试网 » lilisx2006的个人空间 » 日志 在一个没有测试经理的小公司如何做好测试
    mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost' (using password: YES)'
  • 原文地址:https://www.cnblogs.com/ostrich-sunshine/p/6755381.html
Copyright © 2011-2022 走看看