美文网首页我爱编程
数据库笔记(MongoDB)

数据库笔记(MongoDB)

作者: kirito_song | 来源:发表于2017-08-23 13:54 被阅读127次
    IMG_2110.JPG
    • 个人入门学习用笔记、不过多作为参考依据。如有错误欢迎斧正

    老牌数据库

    • 比如MySQL、SQL Server、Oracle、Access。这些数据库、我们称之为结构型数据库。
    • 因为每个表中、都必须有明确的字段。每行记录、都必须有这些字段。
    • SQL(Structure query language)作为语言
    • 向PHP、.net、jsp等语言提供接口
    • 不足
    • 字段不够灵活。不能在同一个表中、单独为某些行开辟新字段、只能全部修改。
    • 数据不够灵活。同一个字段、只能放同一个类型的数据。不能文本、数组、数字等混淆插入。
    屏幕快照 2017-08-23 下午3.05.04.png

    非结构型数据库NoSQL

    • 用json来存储数据
    • NoSQL无法挑战老牌数据库、但是在大数据时代应运而生。

    启动

    • 路径启动
       mongod --dbpath /Users/kiritoSong/Desktop/mongoBin
      

    使用control+c退出

    • 后台启动

    配置文件文件:mongod.conf

     port=27017 #端口号                                                                                                                                                                                       
       fork=true #以守护进程的方式运行,创建服务器进程
       master=true #单主从配置时设为主服务器
       #salve=true ##单主从配置时设为从服务器
       logpath=/data/mongo/27017/mongo.log #日志输出文件路径
       logappend=true #日志输出方式
       dbpath=/data/mongo/27017 #数据库路径
       #replSet=testrs #设置富本集的名字
       #shardsvr=true #设置是否分片
       auth=true#是否开启授权
    

    启动

       mongod -f /Users/kiritoSong/Desktop/mongod.conf
    
    • 关闭

    进入admin数据库后

     db.shutdownServer()
     db.shutdownServer({force : true}) //强制关闭Mongod
    

    创建表

     use xxxx
     show collections
    
    删除表
     db.xxxx.drop()
    

    增加、插入数据

     db.student.insert({'info':{'age':20},'name':'dahuang'});
    

    查询数据:find()

    查找表中所有
    db.student.find()
    
    查找表中指定
    db.student.find({'info.age':20})
    
    查找大于指定条件{$gt:15}
    db.student.find({'age':{$gt:15}})
    
    ‘与’条件---直接“,”隔开
     db.student.find({'age':{$gt:15},'name':'dahuang'})
    
    ’或‘条件---{$or:[K:V,K:V]};
     db.student.find({$or:[{'age':15},{'name':'dahuang'}]})
    
    排序.sort({K&V,K&V})可以依次传入排序条件、权重递减
     db.student.find().sort({'age':1,'asd':1})
    
    分页---limit(每页几条)、skip(从哪开始找)
     db.student.find().limit(4).skip(8)
    
    数据信息--返回count(个数)等
     db.student.stats()
    

    查找数量.count()

    查找
     db.getCollection('student').count({K&V})
    

    修改数据:update

    修改单个---update({查询kv},{$set{修改kv}})
     db.student.update({'name':'xiaoming'},{$set:{'age':16}})
    
    修改多个---update({查询kv},{$set{修改kv}},{multi:1})
     db.student.update({'name':'xiaoming'},{$set:{'age':15}},{multi:1})
    
    直接替换所有数据---不含&set关键字
     db.student.update({'name':'xiaoming'},{'age':1,'name':'xiaoming'})
    

    删除数据:remove

    并不强大

    全部删除
     db.student.remove({'age':12})
    
    删除第一个
     db.student.remove({'age':12},{justOne:1})
    

    Nodejs+MongoDB

    • npm 安装mongodb

    • 使用node进行基础操作

     /**
      * Created by kiritoSong on 17/8/25.
      */
     const express = require('express');
     const app = express();
     
     
     var MongoClient = require('mongodb').MongoClient;
     var assert = require('assert');
     
     
     // Connection URL
     //加入数据库不存在、系统会自动创建一个数据库
     var url = 'mongodb://localhost:27017/MongoDBDemoForNodejs';
     
     
     app.listen(3000);
     //每访问一次、插入一条数据
     app.get('/',(req,res) => {
     
         // 连接数据库
         MongoClient.connect(url, function(err, db) {
             if (err) {
                 res.send('数据库链接失败');
             }
     
             //合集不存在、也会自动创建
             //向合集内插入数据
             db.collection('student').insertOne({
                 //插入的数据
                 'name':'kirito',
                 'age':parseInt(Math.random() * 100 +10)
             },(err,result) => {
                 //插入之后
                 db.close();
                 if (err){
                     res.send('插入数据失败')
                 }
                 res.send('插入数据成功'+result.toString());
                 console.log('插入结果'+result);
                 //关闭数据库
             });
         });
     });
    
    增删改查---简单的DAO

    app.js

     /**
     * Created by kiritoSong on 17/8/25.
      */
     //通过模块封装、分离数据层函数 开发DAO
    
     const express = require('express');
     const app = express();
     const db = require('./models/db.js');
     
     app.listen(3000);
     
     //增加
     app.get('/insert',(req,res) => {
         var json;
         if (JSON.stringify(req.query)=="{}"){
             json = {
                 'name':'kirito_02',
                 'age':parseInt(Math.random() * 100 +10)
             };
         }else {
             json = req.query;
             json['age'] = parseInt(req.query.age)?parseInt(req.query.age):parseInt(Math.random() * 100 +10);
         }
     
     
         db.insertOne('student',json,(err,result) => {
             if (err){
                 res.send('数据插入失败');
             }else {
                 res.send('数据插入成功');
             }
         })
     });
     
     //查找个数
     app.get('/count',(req,res) => {
     
         db.count('student',{},(count) => {
             res.send(count.toString());
         });
     });
    
     //查找
     app.get('/find',(req,res) => {
     
         var args = db.configFindArgs(req.query.page,10);
     
         var json = {};
     
         req.query.age?json['age'] = parseInt(req.query.age):0;
         req.query.name?json['name'] = req.query.name:0;
     
         db.find('student',json,args,(err,result) => {
             if (err){
                 res.send('查询失败');
             }else {
                 res.json({'data':result});
             }
         });
     });
     
     //删除
     app.get('/del',(req,res) => {
     
         var json = {};
         req.query.age?json['age'] = parseInt(req.query.age):0;
         req.query.name?json['name'] = req.query.name:0;
         if (JSON.stringify(json)=="{}") {
             res.send('无效参数');
             return;
         }
     
         db.deleteMany('student',json,(err,results) => {
             if (err){
                 res.send('删除失败');
             }else {
                 console.log(results);
                 res.send('删除成功');
             }
         });
     });
     
     //修改
     app.get('/update',(req,res) => {
         db.updateMany('student',
             {'name':'kirito'},
             {$set:{'age':29}},
             (err,results) =>{
             if (err){
                 res.send('修改失败');
             }else {
                 res.send('修改成功');
             }
         })
     });
    

    db.js

     /**
      * Created by kiritoSong on 17/8/25.
      */
     //包含所有数据库常用操作的模块
     
     var MongoClient = require('mongodb').MongoClient;
     var dbsetting = require('./dbsetting');
     
     // _表示内部函数
     function _connectDB(callback) {
         // 连接数据库
         MongoClient.connect(dbsetting.dburl, (err, db) => {
             if (err){
                 console.log('数据库链接失败');
             }else {
                 console.log('数据库链接成功');
                 callback(db);
             }
         });
     }
     
     
     //插入数据
     //集合名、数据json、回调
     exports.insertOne = function (collctionName,json,callback) {
         _connectDB((db) => {
             db.collection(collctionName).insertOne(json,(err,result) => {
                 callback(err,result);
                 db.close();
             })
         });
     };
     
     //查找数据
     //集合名、数据json
     exports.find = function (collctionName,json,args,callback) {
         console.log('参数个数:'+arguments.length);
         var result = [];
     
         if (arguments.length == 3){
             callback = args;
             args={
                 'limit' : 0,
                 'skip':0
             }
         }else if (arguments.length ==4) {
     
         }else {
             throw new Error('find函数参数必须包含至少collctionName、json、callback');
         }
     
         console.log(`collctionName:${collctionName}+json:${JSON.stringify(json)}+limit:${args.limit}+skip:${args.skip}`);
     
         _connectDB((db) => {
     
             var cursor =db.collection(collctionName).find(json).limit(args.limit).skip(args.skip);
             cursor.each(function(err, doc) {
                 if (err) {
                     callback(err,null);
                     db.close();
                 }
                 if (doc != null) {
                     result.push(doc);
                 } else {
                     //遍历结束||没有更多
                     callback(null,result);
                     db.close();
                 }
             });
         });
     };
     
     //查找个数
     exports.count = function (collctionName,json,callBack) {
         _connectDB((db) => {
             db.collection(collctionName).count(json).then((count) => { 
                 callBack(count);
                 db.close();
             });
         });
     };
    
     //分页配置参数
     exports.configFindArgs = function (page,limit) {
         page = page||0;
         limit = limit||0;
     
         //分页 page参数
         if (page <1 ||!page){
             page = 1;
         }else {
             page = page;
         }
     
         var args = {
             'limit' : 10,
             'skip':(page - 1)*10
         };
         return args;
     };
     
     //删除
     exports.deleteMany = function (collctionName,json,callback) {
         _connectDB((db) => {
             db.collection(collctionName).deleteMany(json,
                 (err, results) => {
                     callback(err,results);
                     db.close();
                 }
             );
         });
     };
     
     //修改
     exports.updateMany = function(collctionName,kjson,vjson,callback) {
         _connectDB((db) => {
     
             // db.collection('restaurants').updateOne(
             db.collection(collctionName).updateMany(
                 kjson,vjson, function(err, results) {
                     console.log(results);
                     callback(err,results);
                 });
     
         })
     
     };
    

    dbsetting.js

     /**
      * Created by kiritoSong on 17/8/25.
      */
     module.exports = {
         'dburl' : 'mongodb://localhost:27017/MongoDBDemoForNodejs'
     }
    

    索引

    • 数据库中根据一个字段的值去寻找一个文档、是很常见的操作。
    • 比如学号、userID等。唯一的值。
    • 建立索引
         1为递增/-1为递减。支持复合索引{'uid':1,'uuid':-1}   unique、索引属性所有文档不能相同(比如name的value)
        db.getCollection('student').createIndex({'uid':1},{unique:true})
      
    • 结果
         {
             "createdCollectionAutomatically" : false,
             "numIndexesBefore" : 3,
             "numIndexesAfter" : 4,
             "ok" : 1.0
          }
      
    WechatIMG62.jpeg
    • 缺点:会使得插入变慢
    • 有点:会使得查询变快
    • 适用:同一时段并没有太多的插入操作、但是频繁查询

    explain()过程函数

    • 让db解释检索的过程

       db.getCollection('BSBlogNotifyNewList').find({}).explain()
      
    • 结果

       /* 1 */
       {
           "queryPlanner" : {
               "plannerVersion" : 1,
               "namespace" : "MongoDBDemoForNodejs.BSBlogNotifyNewList",
               "indexFilterSet" : false,
               "parsedQuery" : {},
               "winningPlan" : {
                   "stage" : "COLLSCAN",
                   "direction" : "forward"
               },
               "rejectedPlans" : []
           },
           "serverInfo" : {
               "host" : "localhost",
               "port" : 27017,
               "version" : "3.4.7",
               "gitVersion" : "cf38c1b8a0a8dca4a11737581beafef4fe120bcd"
           },
           "ok" : 1.0
       }
      

    自增

    • $inc----原属性自增

       //增加所有age+=10
       db.getCollection('student').update({},{$inc: {'age': 10}},{multi:1})
      

    _id主键

     var ObjectID = require('mongodb').ObjectID;
     {_id:new ObjectID(uid)}
    

    主键&&外键&&聚合

    • 以上三点为关系型数据库独有

    • 像uid、sid等唯一的键称为主键。
    • 在其他表中标记的某主键称为外键。
    • 将通过外键、使更多数据连接。称为聚合。
    • mongo可能需要多次查表达到对应效果

    相关文章

      网友评论

        本文标题:数据库笔记(MongoDB)

        本文链接:https://www.haomeiwen.com/subject/nimddxtx.html