mongodb
基本使用
概念
document
collection
mongod
mongo 使用数据库
mongod 开机
mongoimport 导入数据
mongod --dbpath c:mongodata
//--dbpath 参数,表示数据库的存放位置,文件夹必须事先创建//mongoDB 有真实的物理文件,对应一个个数据库。
db.help(); //在 mongodb 客户端中获得帮助
db.stats(); 显示数据库名称、集合数目,以及数据库中的文档
mongodb数据模型
MongoDB 中的数据模式非常灵活。同一集合中的文档不需要具有同一字段或结构,集合文档的公用字段可能包含不同类型的数据。
设计 MongDB 模式时应注意的问题
根据用户需求来设计模式。
如果想一起使用对象,请将这些对象合并到一个文档中,否则要将它们分开(但是要确保不需要连接)。
经常复制数据(但要有一定限度),因为与计算时间相比,硬盘空间显得非常便宜。
在写入时进行连接,而不能在读取时连接。
针对经常发生的用例来设计模式。
在模式中实现复杂的聚合。
数据库中存储众多集合。
数据库最终会变为文件系统里面的文件,而数据库名字就是相应的文件名,所以数据库的命名,应该遵守操作系统的文件名命名规范。
数据库命名不能是admin、local、config
基本命令行操作
列出所有数据库
show dbs;
使用某个数据库
use student1;//如果想新建,也是use, use一个不存在的库名,就是创建一个数据库。
查看当前所在库
db
集合没有查看,需要插入数据之后,能够看到。 如果真的想创建刚才未存在的数据库,那么必须插入一个数据。不需要创建集合。
例如:
db.student.insert({'name': 'xiaoming', 'age': 23}); //student就是所谓的集合(collections)。集合中存储着很多json(document)。 //db. 一个未知的集合名字,这个集合将自动创建。
mongodb增删改查
创建数据库
用 use + 数据库名称 的方式来创建数据库。use 会创建一个新的数据库,如果该数据库存在,则返回这个数据库。
use mydb
使用命令 db 检查当前选定的数据库。
db
使用命令 show dbs 来检查数据库列表。
show dbs
刚创建的数据库(mydb)没有出现在列表中。为了让数据库显示出来,至少应该插入一个文档。
删除数据库
db.dropDatabase(); //删除当前所在的数据库
导入外部数据
mongoimport --db test --collection restaurants --dorp --file ddd.json//--db test 想往那个数据库中导入//--collection restaurants 想往那个集合中导入// --dorp 把集合清空 表示数据库中有默认数据,覆盖原有数据。 //--file ddd.json 使用的是哪个文件.mongoimport --db student --collection class1 --dorp --file a.json
创建集合(表)
db.class1 //如果集合不存在,帮你创建集合
使用 show collections 来查看创建了的集合。
show collections//没有数据,刚创建的 集合 并不显示出来。
插入数据
db.class1.insert({'name': 'ting','age': 21});
查看数据(文档)
db.class1.find({}); //db.class1.find(); //find() 方法会以非结构化的方式来显示所有文档。db.class1.find().pretty();//用格式化方式显示结果//在 find() 方法中,如果传入多个键,并用逗号(,)分隔它们,那么 MongoDB 会把它看成是 AND 条件。 db.class1.find({'key1': 'val1', 'key2': 'val2'}); //若基于 OR 条件来查询文档,可以使用关键字 $or。 //或 的条件db.class1.find({$or: [{key1: val1, key2: val2}]});
排序
db.class.find().sort({'sex': 1}); //1 升序
修改数据
//update暗含查找,修改谁,修改结果 update默认只会修改第一个document,需要第三个参数支持: {'multi': true}
db.class1.update({'name': 'xiaoming'},{$set: {'age': 16}});
//批量修改
db.class1.update({'score.math': '60'},{$set: {'age': 20}}, {'multi': true}); db.class1.update({},{$set: {'age': 20}},{'multi': true}); //第一个参数为空,表示全部数据修改。
//替换document, 没有使用$set关键字,完整替换
db.class1.uodate({'name': 'xiaoming'},{'age': 12});
删除数据
db.student1.drop(); // 删除集合 (篮子都删除)db.studnet1.remove({}) //删除全部 (篮子还存在)db.student1.remove({'score.math': 80}); //会删除全部匹配得到的db.student1.remove({'score.math': 80},{justOne: true}); //删除匹配的第一个
nodeJs 使用 mongodb
//安装 mongodb npm install mongodb
nodejs 操作 mongodb
//mongo db 驱动var MongoClient = require('mongodb').MongoClient;//数据库的地址 /student 表示数据库//假如数据库不存在,没有关系,程序会自动创建数据库var url = 'mongodb://localhsot:27017/student';//建立连接MongoClient.connect(url,function( err,db ){//db 参数就是连接上数据库 实体 所有数据库操作都建立在 实体上。 if( err ){ console.log('数据库连接失败'); return ; } console.log('数据库成功连接'); db.collection('student').insertOne({ 'name': 'mlln', 'age': 23 },function( err,result ){ if (err) { console.log('插入失败'); return ; } console.log(result); res.send('1'); db.close(); });});//cmd 中查看数据 比较多 可以使用 it 查看下一页
插入数据
db.collection('class1').isnertOne({'name': 'xiaoming', 'age': 21},function( err,result ){ if( err ) console.log('数据插入失败'); console.log('数据插入成功'); });
查询数据
var cousor = db.collection('class1').find({}); //find({}) //可以输出查询条件。find({'score.math': 70});//遍历游标cousor.each(function( err,doc ){ if( doc != null ){ console.log(doc); //输出每条记录 }});var cursor = db.collection('class1').find({'score.math': {$gt: 30}});var cursor = db.collection('class1').find({ 'score.math': {$gt: 20} , 'score.cha': {$lt : 70}});var cursor = db.collection('class1').find({ $or: [ {'score.math': {$gt: 50}}, {'scror.cha': {$lt: 70}} ] }); //排序 //1 正序 , -1 反序var cursor = db.collection('class1').find({}).sort({'score.math': 1});
更新
覆盖匹配的记录 //updateOne();
db.collection('class1').updateOne({'name': 'mm'}, {'age': 23},function( err,result ){ if( err ) console.log('修改失败'); console.log('修改成功'); });
修改字段中的值
db.collection.('class1').updateOne({'name': 'mlln'}, { $set: {'age': 24} }, function( err,result ){ if ( err ) console.log('修改失败'); console.log('修改成功'); });
替换记录 //replaceOne();
db.collection('class1').replaceOne({'name': 'mlln'}, {'name': 'm1', 'age': 20});
删除数据
db.collection('class1').deleteMany({'age',25},function( err,reslut ){ if( err ) console.log('删除失败'); console.log('数据删除成功'); });
DAO层封装
mongooose 对象与数据对应,产生ODM思想 , 一个对象new出来之后,数据库中就存在。//db模块封装了所有对数据库的常用操作var MongoClient = require('mongodb').MongoClient;var setting = require('../settings');//连接数据库function _connectDB( callback ){ var url = setting.dburl; //配置文件中读取 MongoClient.connect(url,function( err,db ){ callback(err,db); });}//插入数据//往那个集合中增加,增加什么,增加之后的事情。exports.insertOne = function( collectionName,json,callback ){ _connectDB(function( err,db ){ if ( err ) { callback(err,null); db.close(); //关闭数据库 return ; } db.collection(collectionName).insertOne(json,function ( err,result ) { callback(err,result); db.close(); //关闭数据库 }); });};//查找数据//在那个集合查找,查什么,分页设置,查完之后做什么exports.find = function( collectionName,json,args,callback ){ if ( arguments.length == 3 ) { callback = args; args = {'pageamount': 0, 'page': 0} } else if ( arguments.length == 4 ) { } else { throw new Error('find参数是3个或者四个'); } var result = []; //应该省略的条数 var skipNum = args.pageamount * args.page; //数目限制 var limitNum = args.pageamount; _connectDB(function ( err,db ) { var cursor = db.collection(collectionName).find(json).skip(skipNum).limit(limitNum); cursor.each(function ( err,doc ) { // each 遍历的时候存在问题,callback 匹配到一条,就执行一次, // callback 意义上是只执行一次,使用数组解决 if ( err ) { callback(err,null); db.close(); //关闭数据库 return ; } if ( doc != null ) { result.push( doc ); //放入结果数组 } else { //遍历结束,没有更多文档 callback(null,result); db.close(); //关闭数据库 } }); });};//删除exports.deleteMany = function ( collectionName,json,callback ) { _connectDB(function ( err,db ) { db.collection(collectionName).deleteMany(json,function (err,result) { callback(err,result); db.close(); //关闭数据库 }); });};//修改exports.updateMany = function( collectionName,json1,json2,callback ){ _connectDB(function( err,db ){ if ( err ) { callback(err,null); return false; } db.collection(collectionName).updateMany(json1,json2,function( err,result ){ callback( err,result ); db.close(); }); });};
mongoDB分页
//limit() 表示读取的条数
//skip() 表示略过的条数
limit和skip配合使用就是分页查询。
假如,第一个是page=0,每页10条,所以当前页的查询语句
db.student.find().limit(10).skip(page*10);
数据总数
在shell中,找寻数据总数
db.student.stats().count; //获得collections总数 // 需要向上取整。db.student.find().count();//find() ,有分页逻辑exports.find = function( collectionName,json,args,callback ){ if ( arguments.length == 3 ) { callback = args; args = {'pageamount': 0, 'page': 0} } else if ( arguments.length == 4 ) { } else { throw new Error('find参数是3个或者四个'); return false; } //应该省略的条数 var skipNum = args.pageamount * args.page; //数目限制 var limitNum = args.pageamount; _connectDB(function ( err,db ) { var cursor = db.collection(collectionName).find(json).skip(skipNum).limit(limitNum); cursor.each(function ( err,doc ) { // each 遍历的时候存在问题,callback 匹配到一条,就执行一次, // callback 意义上是只执行一次,使用数组解决 if ( err ) { callback(err,null); return ; } if ( doc != null ) { result.push( doc ); //放入结果数组 } else { //遍历结束,没有更多文档 callback(null,result); } }); });};
cookie & session
cookie
需要cookie-parser中间件支持
HTTP是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页面,服务器无法认识到,这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何关系的。
Cookie是一个简单到爆的想法:当访问一个页面的时候,服务器在下行HTTP报文中,命令浏览器存储一个字符串;浏览器再访问同一个域的时候,将把这个字符串携带到上行HTTP请求中。
第一次访问一个服务器,不可能携带cookie。 必须是服务器得到这次请求,在下行响应报头中,携带cookie信息,此后每一次浏览器往这个服务器发出的请求,都会携带这个cookie。
特点
cookie是不加密的,用户可以自由看到;
用户可以删除cookie,或者禁用它
cookie可以被篡改
cookie可以用于攻击
cookie存储量很小。未来实际上要被localStorage替代,但是后者IE9兼容。
作用:
记录用户的信息,购买习惯,猜你喜欢。
express中的cookie, res负责设置cookie, req负责识别cookie。
cookie是没有跨域限制
cookie使用
var express = require('express');var cookieParser = require('cookie-parser');var app = express();app.use(cookieParser());app.get('/',function ( req,res ) { // maxAge 在express 是以毫秒为单位 res.cookie('xihao','tfboys',{ 'maxAge': 9000, httpOnly: true }); res.send(req.cookies);});app.listen(80);
猜你喜欢
页面中获取原先的值,push到数组中,然后再次设置回来。供首页访问。
var express = require('express');var cookieParser = require('cookie-parser');var app = express();app.use(cookieParser());app.get('/',function ( req,res ) { // maxAge 在express 是以毫秒为单位 res.send('猜你喜欢' + req.cookies.mudidi );});app.get('/gonglve',function ( req,res ) { var mudidi = req.query.mudidi; //记录用户的喜好 //读取用户的喜好,然后把新的数据push设置新的数据 var mudidiArr = req.cookies.mudidi || []; mudidiArr.push( mudidi ); res.cookie('mudidi',mudidiArr,{ 'maxAge': 9000, httpOnly: true }); res.send(mudidi + '旅游攻略');});app.listen(80);
session
需要express-session中间件支持
会话,session并不是天生的就有的技术,而是依赖cookie。
用于登陆。当一个浏览器禁用cookie的时候,登陆效果消失,或者用户清除了cookie,登陆也消失。
session比cookie不一样的地方,session下发的是乱码,并且服务器自己缓存一些东西。下次浏览器的请求,带着乱码上来。此时与缓存(缓存是存在服务器内存中,一旦服务器关了,缓存就消失)进行比较,看看匹配的是哪一个。
所以,一个乱码,可以对应无限大的数据。(理论上),但是受内存限制。
任何语言中,session的使用,是“机理透明”的,它帮你设置cookie的,但是足够方便。
var express = require('express');var app = express();var session = require('express-session');app.use(session({ secret: 'keyboard cat', resave: false, saveUninitialized: true, cookie: { secure: true }}));app.get('/',function( req,res ){ if ( req.session.login == '1' ) { res.send( '欢迎'+ req.session.username +'的登陆' ); } else { res.send('没有成功登陆'); }});app.get('/login',function ( req,res ) { req.session.login = '1'; req.session.username = 'mlln'; res.send('你已经成功登陆');});app.listen(80)
加密
md5 加密 是函数型加密。每次加密的结果相同,没有随机位 //永远不要用明文写密码。
特点:
不管加密的文字,多长多短,永远都是32位英语字母、数字混合。
那怕只改一个字,密文都会大变。
MD5没有反函数的可能。 网上的破解工具,都是字典模式,通过列出明-密对应的字典找到明码。
MD5常用于版本校验。可以比对两个文件、软件是否完全一致。
node中,自带了一个模块 crypto模块,负责加密。
//创建hashvar md5 = crypto.createHash('md5'); //创建一个hash对应//然后update 和 digestvar password = md5.update(fields.password).digest('base64');
console.log( md52( md52('123123').slice(11,7) + md52('123123') ) );function md52( mingma ) { var md5 = crypto.createHash('md5'); var password = md5.update(mingma).digest('base64'); return password;}
GM图像
gm软件
只要服务器需要处理图片,那么这个服务器就需要安装graphicsmagick软件 , 还有其它的图像处理软件。ImageMagick 。
GM软件API
GM-API
nodejs 使用graphicsmagick。需要第三方npm的gm包
GM包运行环境 链接描述
nodejs缩略图制作
var fs = require('fs');var gm = require('gm');gm('./axin.jpg') .resize(50, 50,"!") .write('./axin.jpg', function (err) { if (err) { console.log(err); }});
nodejs头像裁切
gm("./axin.jpg").crop(141,96,152,181).write("./2.jpg",function(err){ //141 96 是宽高 。 152 181是坐标});
关键字:JavaScript, node.js
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!