我的第三十一篇博客---mongo

mongo 进入Mongo
show dbs 展示出mongo里数据库有哪些
db 显示当前数据库
use admin 切换到admin这个数据库
show collections 展示里面的集合
db.info.insert({‘name‘:‘zhangsan‘,‘age‘:20}) 向当前数据库info列里插入这项数据
db.info.find() 查询info里的数据
db.dropDatabase() 删除当前的数据库

mongodb集合的命令
不手动创建集合:向不存在的集合中第一次加入数据时,集合会被创建出来
手动创建集合:
db.createCollection(name,options)
db.createCollection(‘stu‘)
db.createCollection(‘sub‘,{capped:true,size:10,max:10})
size 是整个集合空间大小 单位为Kb
max 是集合文档个数上限单位是 个
参数capped :默认值为false表示不设置上限,值为true表示设置上限
参数size:当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖

查看集合:show collections
删除集合:db.集合名称.drop()
检查集合是否有上限:db.集合名.isCapped()
db.stu.renameCollection(‘stu2‘) 将集合stu重命名为stu2

权限管理

mongodb的权限管理方案
MongoDB是没有默认管理员账号,所以要先添加管理员账号,并且mongodb服务器需要在运行的时候开启验证模式,用户只能在用户所在数据库登录(创建用户的数据库),包括管理员账号。
管理员可以管理所有的数据库,但是不能直接管理其他数据库,要先认证后才可以

mongodb超级管理员账号的创建
创建超级用户 使用admin数据库(超级管理员账号必须创建在该数据库上)
use admin
创建超级用户
db.createUser({‘user‘:‘python‘,‘pwd‘:‘python‘,‘roles‘:[‘root‘]})
创建成功会显示如下信息
Successfully added user:{‘user‘:‘python‘,‘roles‘:[‘root‘]}

退出客户端再次登陆验证 此时在使用数据库各命令的时候会报权限错误,需要认证才能执行相应操作

use admin
db.auth(‘python‘,‘python‘)
python用户是创建在admin数据库上的,所以必须来到admin数据库上进行认证,认证成功会返回1,失败返回0

创建普通用户
1、选择需要创建用户的数据库
use test1
2、在使用的数据库上创建普通用户
db.createUser(‘user‘:‘user1‘,‘pwd‘:‘pwd1‘,‘roles‘:[‘read‘])
创建普通用户user1,该用户在test1上的权限是只读
db.createUser(‘user‘:‘user1‘,‘pwd‘:‘pwd1‘,roles:[‘readWrite‘])
创建普通用户user1,该用户在test1上的权限是读写

在其他数据库上创建普通用户
db.createUser({‘user‘:‘python1‘,‘pwd‘:‘python1‘,roles:[{‘role‘:‘read‘,‘db‘:‘dbname1‘},{‘role‘:‘readWrite‘,‘db‘:‘dbname2‘}]})
在admin上创建python1用户,python1用户权限有两个,一个在dbname1上的只读,另一个是在dbname2上的读写

查看创建的用户
show users

删除用户
db.dropUser(‘python‘)

数据类型:

常见类型
Object ID:文档,类似mysql中的id
String:字符串,最常用,必须是有效的UTF-8
Boolean:存储一个布尔值,true或false
Integer:整数可以是32位或64位,这取决于服务器
Double:存储浮点值
Arrays:数组或列表,多个值存储到一个键
Object:用于嵌入式的文档,即一个值为一个文档
Null:存储Null值
Timestamp:时间戳,表示从1970-1-1到现在的总秒数
Data:存储当前日期或时间的UNIX时间格式

注意点:
每个文档都有一个属性,位_id,保证每个文档的唯一性,mongodb默认使用_id作为主键
可以自己去设置_id插入文档。如果没有提供,那么MongoDB为每个文档提供了一个独特的_id,类型为objectID
objectID是一个12字节的十六进制数,每个字节两位,一共是24位的字符串:前4个字节为当前的时间戳,接下来3个字节的机器ID 接下来的2个字节中MongoDB的服务进程id 最后3个字节是简单的增量值

 增删改查

插入:
db.集合名称.insert(document)
例如:
db.stu.insert({name;‘gj‘,gender:1})
db.stu.insert({_id:‘20170101‘,name:‘gj‘,gender:1})

插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的objectId

mongodb的保存
命令:db.集合名词.save(document)如果文档的_id已经存在则修改,如果文档的_id不存在则添加

查询:
命令:db.集合名称.find()

db.stu.count() 查询stu集合里有几条记录
db.stu.find({name:‘zhangsan‘}).count() 查询stu集合里name为zhangsan的有几条记录

mongodb的更新
命令:db.集合名词.update(<query>,<update>,{multi:<boolean>})

参数query:查询条件
参数update:更新操作符
参数multi可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
db.stu.update({name:‘hr‘},{$set:{name:‘hys‘}}) 指定键值更新操作
db.stu.update({},{$set:{gender:0}},{multi:true}) 更新全部
注意:"multi update only works with $ operators"
mongodb的删除

命令:db.集合名称.remove(<query>,{justOne: <boolean>})

db.stu.drop() 删除stu这个集合

db.dropDatabase() 删除当前数据库

参数query:可选,删除的?档的条件
参数justOne:可选, 如果设为true或1, 则只删除?条, 默认false, 表示删除多条

 聚合查询

语法:
db.集合名称.aggregate({管道:{表达式}})

$group:将集合中的文档分组,可用于统计结果
$match:过滤数据,只输出符合条件的文档
$project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
$sort:将输入文档排序后输出
$limit:限制聚合管道返回的文档数
$skip:跳过指定数量的文档,并返回余下的文档

常用表达式:
表达式:处理输入文档并输出 语法: 表达式:‘$列名‘
常用表达式:
$sum :计算总和,$sum:1 表示以一倍计数
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:在结果文档中插入值到一个数组中

管道命令:

按照某个字段进行分组
$group是所有聚合命令中用的最多的一个命令,用来将集合中的文档分组,可用于统计结果
使用示例如下:
db.stu.aggregate([{$group:{‘_id‘:‘$gender‘,‘counter‘:{$sum:1}}}])
其中注意点:
db.集合名.aggregate 是语法,所有的管道命令都需要写在其中
_id表示分组的依据,按照哪个字段进行分组,需要使用$gender表示选择这个字段进行分组
$sum:1 表示把每条数据作为1进行统计,统计的是该分组下面数据的条数

group by null
当我们需要统计整个文档的时候,$group的另一种用途就是把整个文档分为一组进行统计
使用示例如下:
db.stu.aggregate([{$group:{‘_id‘:null,‘counter‘:{$sum:1}}}])
其中注意点:
_id:null表示不指定分组的字段,即统计整个文档,此时获取的counter表示整个文档的个数

数据透视
正常情况在统计的不同性别的数据的时候,需要知道所有的name,需要逐条观察,如果通过某种方式把所有的name放在一起,那么此时就可以理解为数据透视
使用示例如下:
统计不同性别的学生:
db.stu.aggregate({$group:{_id:null,name:{$push:‘$name‘}}})

使用$$ROOT可以将整个文档放入数组中
db.stu.aggregate({$group:{_id:null,all:{$push:‘$$ROOT‘}}})

 

管道命令之$match
$match用于进行数据的过滤,是在能够在聚合操作中使用的命令,和find区别在于$match操作可以把结果交给下一个管道处理,而findb学
使用示例如下:

查询年龄大于20的学生
db.stu.aggregate({$match:{age:{$gt:20}}})

查询年龄大于20的男女生的人数
db.stu.aggregate([{$match:{}}age:{$get:20},{$group:{_id:‘$gender‘,counter:{$sum:1}}}])

管道命令之$project
$project用于修改文档的输入输出结构,例如重命名,增加,删除字段
使用示例如下:
查询学生的年龄、姓名。仅输出姓名年龄,修改age字段名为age1
db.stu.aggregate({$project:{_id:0,name:1,age:1,age1:‘$age‘}})

查询男女生人数,输出人数
db.stu.aggregate([{$group:{_id:‘$gender‘,counter:{$sum:1}}{$project:{_id:0,counter:1}}}])

6 管道命令之$sort

$sort用于将输入的文档排序后输出

使用示例如下:

查询学生信息,按照年龄升序

db.stu.aggregate({$sort:{age:1}})
查询男女人数,按照人数降序

db.stu.aggregate([
{$group:{_id:"$gender",counter:{$sum:1}}},
{$sort:{counter:-1}}]
)

7 管道命令之$skip 和 $limit

$limit限制返回数据的条数
$skip 跳过指定的文档数,并返回剩下的文档数
同时使用时先使用skip在使用limit
使用示例如下:

查询2条学生信息

db.stu.aggregate(
{$limit:2}
)

查询从第三条开始的学生信息

db.stu.aggregate(
{$skip:3}
)

统计男女生人数,按照人数升序,返回第二条数据

db.stu.aggregate([
{$group:{_id:"$gender",counter:{$sum:1}}},
{$sort:{counter:-1}},
{$skip:1},
{$limit:1}]
)

查询示范代码:

db.stu.insertMany([{},{},{}]) 插入多条数据
db.stu.find() 查询stu集合里的所有文档
db.stu.find({‘title‘:‘1‘}) 查询stu集合里title为1的文档
db.stu.find({‘title‘:/u/}) 查询stu集合里title里含有u的文档
db.stu.find({‘title‘:/^u/,‘rank‘:3}) 查询stu集合里title开头为u,并且rank为3的文档
$gte 大于等于
$gt 大于
$lte 小于等于
$lt 小于
$eq 等于
$ne 不等于
例如:
db.stu.find({‘title‘:{$gt:4}}) 查询stu集合里title 大于4 的文档
db.stu.find({‘title‘:{$gt:4,$lte:6}}) 查询stu集合里title 大于4并且小于等于6的文档
db.stu.find({‘title‘:{$or:[{$gt:5,$lt:3}}]}) 查询stu集合里title 大于5或者小于3的文档
db.posts.distinct(‘tag‘) 去重查询posts集合里tag字段名
db.posts.find({‘rank‘:{$gte:3}}) 查询posts集合里rank大于等于3的文档
db.posts.find({‘rank‘:{$eq:4}}) rank等于4的文档
db.posts.find({‘rank‘:{$ne:4}}) rank不等于4的文档
db.posts.find({‘title‘:/之/,‘rank‘:3}) title含有之而且rank为3
db.posts.find({$or:[{‘title‘:/之/},{‘rank‘:3}]}) title含有之或者rank为3
db.posts.find({‘rank‘:{$in:[3,4]}}) rank含有3或者4
db.posts.insert({‘title‘:‘查询是否存在‘,‘istop‘:true})
db.posts.find({‘istop‘:{$exists:true}}) 查询文档里字段含有istop的文档
db.posts.find({‘istop‘:{$exists:false}}) 查询文档里字段不含有istop的文档
db.posts.find({},{‘_id‘:0}).sort({‘rank‘:1}) 按照rank进行升序排序 1为升序-1为降序 _id:0为不显示该字段 1显示 也可以用true和false表示
db.posts.find({},{‘_id‘:0}).sort({‘rank‘:1},{‘title‘:-1}) 先按照rank升序排序如果ran‘k相等再按照title降序排序
db.posts.find().limit(3) 找前三条 只有一个参数
db.posts.find({‘rank‘:{$gt:3,$lt:5}},{‘_id‘:0}) rank大于3且小于5的文档
db.stu.find().skip(2).limit(3) 跳过前两条后取前三条记录
db.posts.find({$or:[{‘rank‘:{$gt:5}},{‘rank‘:{$lt:3}}]},{‘_id‘:0}) 查询rank大于5或者小于3的文档

 索引:

db.stu.getIndexes() 查看索引
db.stu.createIndex({‘rank‘:-1}) 创建索引
db.stu.dropIndex({‘rank‘:-1}) 删除索引
db.stu.createIndex({‘title‘:1},{unique:true}) 创建唯一索引 title里的数据不重复
db.stu.find({name:‘test10000‘}).explain(‘executionStats‘) 打印出执行状态 里面有时间

 数据备份:

备份的语法:mongodump -h dbhost -d dbname -o dbdirectory

-h: 服务器地址, 也可以指定端?号
-d: 需要备份的数据库名称
-o: 备份的数据存放位置, 此?录中存放着备份出来的数据
示例:mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak

2 恢复

恢复语法:mongorestore -h dbhost -d dbname --dir dbdirectory

-h: 服务器地址
-d: 需要恢复的数据库实例
--dir: 备份数据所在位置
示例:mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1

3 导出

用于和其他平台进行交互对接,将数据导出成指定格式文件进行使用,比如数据分析常用的csv文件 用于给非计算机行业的用户查看数据,对于他们来说csv文件(打开之后是电子表格)更方便

导出语法: mongoexport -h dbhost -d dbname -c colname -o filename --type json/csv -f field

-h: 服务器地址
-d: 数据库名
-c: 集合名
-o: 导出文件名
--type: 文件类型,默认json格式,可选数据类型json,csv
-f: 需要导出的字段,导出为json格式的数据时可以不指定导出哪些字段,默认全部,导出成csv文件是必须指定
示例:mongoexport -h 192.168.196.128:27017 -d test2 -c col1 -o test1_col1 [--type csv -f name,age,number]

4 导入

导出语法: mongoimport -d dbname -c colname --file filename [--headerline --type json/csv -f field]

-h: 服务器地址
-d: 数据库名
-c: 集合名
-o: 导出文件名
--type: 文件类型,默认json格式,可选数据类型json,csv
-f: 需要导出的字段,导出为json格式的数据时可以不指定导出哪些字段,默认全部,导出成csv文件是必须指定
示例:mongoexport -h 192.168.196.128:27017 -d test2 -c col1 -o test1_col1 --type csv -f name,age,number

原文地址:https://www.cnblogs.com/sll-csdn/p/10926121.html

时间: 2024-09-30 15:49:37

我的第三十一篇博客---mongo的相关文章

我的第三十篇博客---scrapy框架

scrapy安装需要一个异步模块Twisted,这个模块得自己手动安装 Twisted下载地址:https://blog.csdn.net/coco56/article/details/82145425 如果自己是python 37 -64位,可以下载这个网盘的文件 按需求选取 pycharm 安装: pip install Twisted存放的路径 打开cmd 运行 scrapy 出数据表示安装成功 不是内部命令,未安装 然后 需要升级 运行指令: pip install pypiwin32

我的第三十二篇博客---mongo和python结合

交互再用管道 或者$ 的时候 要加引号括住ret=collection.find({'$or':[{'age':{'$gt':20}},{'age':{'$lt':17}}]})ret=collection.aggregate([{"$group":{'_id':'$age'}}]) from pymongo import MongoClientclient=MongoClient(host='localhost',port=27017)collection=client['test'

我的第三十三篇博客---flask

使用框架的优点:稳定性和可扩展性强可以降低开发难度,提高了开发效率 在Python中常用的Web框架有:flaskdjangotornado Flask诞生于2010年,是Armin ronacher用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQL_Alchemy),都需要用第三方的扩展来实现.其WSGI工具箱采用Werkzeu

我的第二十一篇博客---Mysql强化及应用于python

使用python读取数据库: from pymysql import connectconn=connect(host='localhost',port=3306,database='数据库名',user='root',password='密码',charset='utf8')#获取cursor对象cur=conn.cursor()#执行sql语句sql="select *from stu"cur.execute(sql)#fetchall取多条数据result=cur.fetchal

一篇博客分清shell中的状态返回值-return-break-continue-exit

一篇博客分清shell中的状态返回值-return-break-continue-exit 一.break.continue.exit.return的区别和对比 条件与循环控制及程序返回值命令知识表 命令 说明 break n 如果省略n,则表示跳出整个循环,n表示跳出循环的层数 continue n 如果省略n,则表示跳出本次循环,忽略本次循环剩余代码,进入循环的下一次循环.n表示退到第n层继续循环 exit n 表示退出当前shell程序,n为上一次程序执行的状态返回值,n也可以省略,在下一

一篇博客让你了解RxJava

RxJava可以说是2016年最流行的项目之一了,最近也接触了一下RxJava,于是想写一篇博客,希望能通过这篇博客让大家能对其进行了解,本篇博客是基于RxJava2.0,跟RxJava1.0还是有很多不同的 基础知识 RxJava的核心就是"异步"两个字,其最关键的东西就是两个: Observable(被观察者) Observer/Subscriber(观察者) Observable可以发出一系列的 事件,这里的事件可以是任何东西,例如网络请求.复杂计算处理.数据库操作.文件操作等等

[iOS]关于 App 混合(Hybrid)开发的优化,包括H5、Weex等(本篇博客主要针对 iOS 应用讲解,但该思想同样适用于Android)

我们知道混合开发,可以节省很多成本(时间成本,经济成本等等),所以有很多公司比较钟爱这种开发形式,今天所讲的优化方式,也是我在我们公司的应用中实际用了的,而且我写的这个优化的 SDK 已经开源到 github 上了,有兴趣的同学可以下载来看一下,有不足的地方欢迎指正.这里给出链接:https://. 转载请注明出处:http://www.cnblogs.com/shisishao/p/6830736.html -.首先,先介绍下什么是混合开发: 我们通常把移动开发分为Web.Native和Hyb

一篇博客彻底了解Android广播机制

首发于http://blog.csdn.net/pwiling/article/details/47682413,禁止转载 之前数次在程序中碰到Android广播,总是有这个疑问:往往是在发送广播的activity里面进行动态注册,动态注册必须要获得BroadcastReceiver对象,既然我们已经获得了广播接受器的对象,为何还要发送广播,直接用广播接收器的对象调用里面的相关逻辑处理的方法,不行吗?为什么还要绕这么一大圈用广播呢? 以前都是走马观花,这次弄清楚了.在解答这个问题之前,我们首先来

小白神器 - 一篇博客学会HTML

小白神器 - 一篇博客学会HTML 一. 简介 1. HTML 定义 htyper text markup language  即超文本标记语言. 超文本: 就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素. 标记语言: 标记(标签)构成的语言. 2. 标签定义和属性 是由一对尖括号包裹的单词构成 例如: <html> *所有标签中的单词不可能以数字开头. 标签不区分大小写.<html> 和 <HTML>. 推荐使用小写. 标签分为两部分: 开始标签<a