非关系型数据库——Mongodb笔记

SQL:

  1.     关系型数据模型
  2.     数据被存放在表中
  3.     每条记录(数据)都是相同类型并且具有相同属性
  4.     存储数据需要定义
  5.     添加新数据必须修改表结构
  6.     ACID事务支持

NoSQL

  1.     非关系型数据模型
  2.     可以存储json、键值对等
  3.     灵活设置表结构
  4.     混合存储数据类型(不影响其他数据)
  5.     支持ACID事务
  6.     一致性可以改变
  7.     横向扩展

MongoDB术语
1.文档(document)相当于传统数据库中的“行”,但是比“行”复杂(信息)
2.集合(collections)在MongoDB中表示一组文档,类似表,集合是没有模式(可以混合插入不同的数据类型)的
3.数据库(database)
MnogoDB基础命令
winpty mongo
show dbs查看数据库
use databasename#创建数据库,并使用
db.stats()查看当前状态
db.getMongo()查看本地地址与端口号
db.createCollection("tablename",{size:??,capped:true,max:??})创建集合
设置capped为true,插入数据大于size时,会覆盖掉最开始数据。
db.pytest1.insert({'name':'aa','age':45})直接创建pytest1表,并插入数据
db.pytest1.save({'name':'bb','age':50})插入数据。


show collections查看集合名
post={'':'','':''.........}数据
db.tablename.insert(post)插入数据
db.tablename.find()          
db.tablename.find().pretty()格式化查询结果

db.pyus


er.find({age:{$lt:50,$gt:45}}).pretty() 查询age大于45小于50的信息
$gt        > 
$lt         < 
$lte       <= 
$gte      >=
 db.pyuser.find({},{name:1})  1表示True,取指定字段名称,默认一页显示20 条
it 显示更多记录

db.pyuser.find({age:50},{name:1,age:1}).pretty() 第一个字典为查询条件

db.pyuser.find().sort({age:1}).pretty()1表示升序,-1表示降序
——————————————limit——————————————————
db.pyuser.find().skip(3).limit(3).pretty() skip跳过 limit限制条数

 db.pyuser.find({$or:[{age:25},{age:50}]}).pretty()查询年龄是25或50的信息

 db.pyuser.count()查询集合的条数

 db.goods.find(age:{$exists:true})查询具有age字段的记录


 db.pytest.drop()删除pytest表

insert:在insert增加id属性时,当表如果有该id对应的数据,插入会报错,错误原因为duplicate key error.
  save:当表如果有该id对应的数据,会修改该表中的原有属性.

更新:
 db.pytest1.update({name:'aa'},{$set:{name:'newaa'}})        更新一条
 db.pytest1.update({name:'bb'},{$set:{name:'newbb'}},false,true)           全部更新
update(条件,更新数据,是否插入新数据,是否全部更新)

是否插入数据表示:如果不存在update条件匹配的记录,是否要插入到集合中。默认为false不插入,true插入

mysqladmin -u root -p password 修改mysql密码
db.user.aggregate([{$group:{_id:"$sex",total:{$sum:1}}}])按sex分组,统计每组个数,升序排列。
db.user.aggregate([{$group:{_id:"$sex",avg:{$avg:"$score"}}}])按sex分组,统计每组平均数。
__________________________push_______________________________
 db.user.aggregate([{$group:{_id:"$sex",scores:{$push:"$score"}}}])
{ "_id" : "f", "scores" : [ 95 ] }
{ "_id" : "m", "scores" : [ 100, 90, 85, 75 ] }统计每组的具体值

> db.user.aggregate([{$group:{_id:"$sex",scores:{$push:"$score",$push:'$name'}}}])
{ "_id" : "f", "scores" : [ "董明珠" ] }
{ "_id" : "m", "scores" : [ "Jack Ma", "Pnoy Ma", "Robin Li", "IG.wxz" ] }
分组显示全部数据
> db.user.aggregate([{$group:{_id:"$sex",scores:{$push:"$score"},name:{$push:'$name'}}}])
{ "_id" : "f", "scores" : [ 95 ], "name" : [ "董明珠" ] }
{ "_id" : "m", "scores" : [ 100, 90, 85, 75 ], "name" : [ "Jack Ma", "Pnoy Ma", "Robin Li", "IG.
wxz" ] }
#去重
> db.user.aggregate([{$group:{_id:'$sex',names:{$addToSet:'$name'}}}])
{ "_id" : "f", "names" : [ "董明珠" ] }
{ "_id" : "m", "names" : [ "IG.wxz", "Robin Li", "Pnoy Ma", "Jack Ma" ] }
#获取分组的第一个值
> db.user.aggregate([{$group:{_id:'$sex',firstname:{$first:'$name'}}}])
{ "_id" : "f", "firstname" : "董明珠" }
{ "_id" : "m", "firstname" : "Jack Ma" }
————————————————————————————————————————
管道的概念:
管道在Unix和Linux中一般用于将当前命令的输出结果作为(下是一个条件/下有一个命令)的参数。
MongDB的聚合管道是将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理,管道的操作是可以重复的。
管道操作有以下:
1.$project 作用是修改文档的结构,用来重命名,增加或删除 文档中的字段。
查询name和score域
> db.user.aggregate({$project:{name:1,score:1,_id:0}})
{ "name" : "Jack Ma", "score" : 100 }
{ "name" : "Pnoy Ma", "score" : 90 }
{ "name" : "Robin Li", "score" : 85 }
{ "name" : "董明珠", "score" : 95 }
{ "name" : "IG.wxz", "score" : 75 }
{ "name" : "IG.wxz", "score" : 90 }
将查询到的结果的score加10
> db.user.aggregate({$project:{name:1,score:{$add:["$score",10]}}})
{ "_id" : ObjectId("5b95b8f087e544934782321e"), "name" : "Jack Ma", "score" : 110 }
{ "_id" : ObjectId("5b95b93187e544934782321f"), "name" : "Pnoy Ma", "score" : 100 }
{ "_id" : ObjectId("5b95b95287e5449347823220"), "name" : "Robin Li", "score" : 95 }
{ "_id" : ObjectId("5b95b96b87e5449347823221"), "name" : "董明珠", "score" : 105 }
{ "_id" : ObjectId("5b95b99487e5449347823222"), "name" : "IG.wxz", "score" : 85 }
{ "_id" : ObjectId("5b95c05887e5449347823223"), "name" : "IG.wxz", "score" : 100 }
————————————————————————————————————————
2.$match
作用于过滤文档,相当于find()第一个参数
注意:
(1)在$math中不能和$where表达式混合使用
(2)如果$math位于管道的第一个阶段,可以利用索引提高查询速
(3)$math尽量出现在管道的最前面,过滤出需要的数据,在后续的阶段中可以提高效率
(4)$math中使用$text操作符的话,只能位于管道的第一阶段
> db.user.aggregate([{$project:{_id:0}},{$match:{'score':{$lt:90}}}])
{ "name" : "Robin Li", "age" : 40, "sex" : "m", "score" : 85 }
{ "name" : "IG.wxz", "age" : 30, "sex" : "m", "score" : 75 }

> db.user.aggregate([{$project:{_id:0}},{$match:{'score':{$gt:80,$lt:100}}},{$group:{_id:'
$sex',count:{$sum:1}}}])
{ "_id" : "f", "count" : 1 }
{ "_id" : "m", "count" : 3 }
——————————————————————————————————————
3.$sort
> db.user.aggregate([{$sort:{score:1}},{$project:{_id:0}},{$limit:2}])#按分数排序,且显示前两条
{ "name" : "IG.wxz", "age" : 30, "sex" : "m", "score" : 75 }
{ "name" : "Robin Li", "age" : 40, "sex" : "m", "score" : 85 }
****   ****  ****  ****  ****  ****  ****  ****  ****  ****  ****  ****  ****  ****  ****  ****
$or、$nor、$not、$and  ###表达式运算符
> db.user.aggregate([{$project:{_id:0,name:1,newscore:{$and:[{$ne:['$score',90]},{$ne:['$s
ex','f']}]}}}])
{ "name" : "Jack Ma", "newscore" : true }
{ "name" : "Pnoy Ma", "newscore" : false }
{ "name" : "Robin Li", "newscore" : true }
{ "name" : "董明珠", "newscore" : false }
{ "name" : "IG.wxz", "newscore" : true }
{ "name" : "IG.wxz", "newscore" : false }
> db.user.aggregate([{$project:{_id:0,name:1,newscore:{$and:[{$eq:['$score',90]},{$eq:['$s
ex','f']}]}}}])
{ "name" : "Jack Ma", "newscore" : false }
{ "name" : "Pnoy Ma", "newscore" : false }
{ "name" : "Robin Li", "newscore" : false }
{ "name" : "董明珠", "newscore" : false }
{ "name" : "IG.wxz", "newscore" : false }
{ "name" : "IG.wxz", "newscore" : false }


比较运算符
$eq $gt $lt $gte $lte $ne

> db.pytimer.aggregate([{$project:{year:{$year:'$data'},hour:{$hour:'$data'},week:{$week:'
$data'},dayofweek:{$dayOfWeek:'$data'}}}])
{ "_id" : ObjectId("5b95e59087e5449347823224"), "year" : 2018, "hour" : 3, "week" : 36, "d
ayofweek" : 2 }
聚合管道的优化
这是一个策略:
(1)将$match和$sort放到管道的前面,可以给集合建立索引,提高处理数据的效率
(2)可以使用match limit skip 对文档进行提前过滤,减少后续处理文档的数量
阶段优化
(1)sort + match
顺序优化
如果match在sort之后,优化器会自动把match放到sort之前
(2)limit+skip
如果skip在limit之后,优化器会吧limit移动到skip之前,移动后的limit的 值等于原来的值加上skip的值
eg: skip 10 limit 5————》limit 15 skip 10


聚合管道的限制作用就是对返回结果大小和内存的限制
MongoDB对返回结果的大小限制
返回一个文档大小不能超过16M只是MongoDB2.6版本之前的规定
2.6之后返回的结果可以是一个游标或者放到集合里,返回不受16M限制
内存的要求
管道每一个阶段只能使用100M内存,如果超过会报错,如果处理大数据时,
可以使用allowDiskUse选项,将数据存到磁盘上。以上的可以称为 多目管道
单目管道distinct()\count()
 

猜你喜欢

转载自blog.csdn.net/qq_35328369/article/details/82763250