-
个人入门学习用笔记、不过多作为参考依据。如有错误欢迎斧正
老牌数据库
- 比如MySQL、SQL Server、Oracle、Access。这些数据库、我们称之为结构型数据库。
- 因为每个表中、都必须有明确的字段。每行记录、都必须有这些字段。
- SQL(Structure query language)作为语言
- 向PHP、.net、jsp等语言提供接口
不足
- 字段不够灵活。不能在同一个表中、单独为某些行开辟新字段、只能全部修改。
- 数据不够灵活。同一个字段、只能放同一个类型的数据。不能文本、数组、数字等混淆插入。
非结构型数据库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 }
缺点:会使得插入变慢
有点:会使得查询变快
适用:同一时段并没有太多的插入操作、但是频繁查询
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可能需要多次查表达到对应效果