数据库笔记(MongoDB)

数据库笔记(MongoDB)_第1张图片
IMG_2110.JPG
  • 个人入门学习用笔记、不过多作为参考依据。如有错误欢迎斧正

老牌数据库

  • 比如MySQL、SQL Server、Oracle、Access。这些数据库、我们称之为结构型数据库。
  • 因为每个表中、都必须有明确的字段。每行记录、都必须有这些字段。
  • SQL(Structure query language)作为语言
  • 向PHP、.net、jsp等语言提供接口
  • 不足
  • 字段不够灵活。不能在同一个表中、单独为某些行开辟新字段、只能全部修改。
  • 数据不够灵活。同一个字段、只能放同一个类型的数据。不能文本、数组、数字等混淆插入。
数据库笔记(MongoDB)_第2张图片
屏幕快照 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
        }
    
数据库笔记(MongoDB)_第3张图片
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))