分布式文档存储独角兽MongoDB——MongoDB常见命令(2)
分布式文档存储独角兽MongoDB
二、MongoDB常见命令
1.1 MongoDB的基本操作
查看数据库
show dbs;
切换数据库 如果没有对应的数据库则创建
use 数据库名;
切换库,如果库不存在则自动创建此库
创建新的库,再次查询时,并没有显示新创建的库信息,因为库中没有内容,所有不显示
创建集合 (相当于创建表)
db.createCollection("集合名")
查看集合
show tables;show collections;
删除集合
db.集合名.drop();
删除当前数据库
db.dropDatabase();
1.2 MongoDB集合数据操作(CURD)
2.2.1 数据添加
插入单条数据语法:
db.集合名.insert(文档)
文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。
BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON。
例如:
db.tb_employee.insert({name:"金莲",birthday:new ISODate("2020-11-11"),salary :15000,gender:0,departmentId :"bj"})
没有指定 _id 这个字段 系统会自动生成 当然我们也可以指定 _id_id 类型是ObjectId 类型是一个12字节 BSON 类型数据,有以下格式:前4个字节表示时间戳 ObjectId("对象Id字符串").getTimestamp() 来获取接下来的3个字节是机器标识码紧接的两个字节由进程id组成(PID)最后三个字节是随机数。
- 插入多条数据
db.集合名.insert([文档,文档])
2.2.2 数据查询
比较条件查询
db.集合名.find(条件)
操作 | 条件格式 | 例子 | RDBMS中的条件 |
---|---|---|---|
等于 | {key:value} | db.col.find({字段名:值}).pretty() | where 字段名=值 |
大于 | {key:{$gt:value}} | db.col.find({字段名:{$gt:值}}).pretty() | where 字段名>值 |
小于 | {key:{$lt:value}} | db.col.find({字段名:{$lt:值}}).pretty() | where 字段名<值 |
大于等于 | {key:{$gte:value}} | db.col.find({字段名:{$gte:值}}).pretty() | where 字段名>=值 |
小于等于 | {key:{$lte:value}} | db.col.find({字段名:{$lte:值}}).pretty() | where 字段名<=值 |
不等于 | {key:{$ne:value}} | db.col.find({字段名:{$ne:值}}).pretty() | where 字段名!=值 |
逻辑条件查询
and 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件db.集合名.find({key1:value1, key2:value2}).pretty()
or 条件
db.集合名.find({$or:[{key1:value1}, {key2:value2}]}).pretty()
not 条件
db.集合名.find({key:{$not:{$操作符:value}}).pretty()
分页查询
db.集合名.find({条件}).sort({排序字段:排序方式})).skip(跳过的行数).limit(一页显示多少数据)
2.2.3 数据更新 调用update
$set :设置字段值$unset :删除指定字段$inc:对修改的值进行自增db.集合名.update(<query>,<update>,{upsert: <boolean>,multi: <boolean>,writeConcern: <document>})
参数说明:
query : update的查询条件,类似sql update查询内where后面的。update : update的对象和一些更新的操作符(如$set,$inc...)等,也可以理解为sql update中set后面的upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。multi : 可选,MongoDB 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。writeConcern :可选,用来指定mongod对写操作的回执行为比如写的行为是否需要确认。
$set :设置字段值
upsert设置成true,如果数据不存在,会进行添加操作
$inc:对修改的值进行自增
$unset :删除指定字段
注意:在进行更新操作的时候,如果没有编写操作关键字,那当前数据的其他字段将被全部删除,只保留更新字段
举例:(暂时跳过)
db.集合名.update({条件},{$set:{字段名:值}},{multi:true})writeConcern 包括以下字段:{ w: <value>, j: <boolean>, wtimeout: <number> }w:指定写操作传播到的成员数量比如:w=1(默认):则要求得到写操作已经传播到独立的Mongod实例或副本集的primary成员的确认w=0:则不要求确认写操作,可能会返回socket exceptions和 networking errorsw="majority":要求得到写操作已经传播到大多数具有存储数据具有投票的(data-bearing voting)成员(也就是 members[n].votes 值大于0的成员)的确认j:要求得到Mongodb的写操作已经写到硬盘日志的确认比如:j=true:要求得到Mongodb(w指定的实例个数)的写操作已经写到硬盘日志的确认。j=true本身并不保证因为副本集故障而不会回滚。wtimeout:指定write concern的时间限制,只适用于w>1的情况wtimeout在超过指定时间后写操作会返回error,即使写操作最后执行成功,当这些写操作返回时,MongoDB不会撤消在wtimeout时间限制之前执行成功的数据修改。如果未指定wtimeout选项且未指定write concern级别,则写入操作将无限期阻止。 指定wtimeout值为0等同于没有wtimeout选项。
2.2.4 数据删除
db.collection.remove(<query>,{justOne: <boolean>,writeConcern: <document>})
参数说明:
query :(可选)删除的文档的条件。justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值false,则删除所有匹配条件的文档。writeConcern :(可选)用来指定mongod对写操作的回执行为。
1.3 MongoDB 聚合操作
2.3.1 聚合操作简介
聚合是MongoDB的高级查询语言,它允许我们通过转化合并由多个文档的数据来生成新的在单个文档里不存在的文档信息。一般都是将记录按条件分组之后进行一系列求最大值,最小值,平均值的简单操作,也可以对记录进行复杂数据统计,数据挖掘的操作。聚合操作的输入是集中的文档,输出可以是一个文档也可以是多个文档。
2.3.2 MongoDB 聚合操作分类
- 单目的聚合操作(Single Purpose Aggregation Operation)
- 聚合管道(Aggregation Pipeline)
- MapReduce 编程模型
2.3.3 单目的聚合操作
单目的聚合命令常用的有:count() 和 distinct()
db.tb_employee.find().count()
2.3.4 聚合管道(Aggregation Pipeline)
语法:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)如:/*聚合管道:按照性别分组,求每组的个数*/db.tb_employee.aggregate([{$group: { _id: "$gender",gender_count:{$sum: 1}}}])
MongoDB中聚合(aggregate)主要用于统计数据(诸如统计平均值,求和等),并返回计算后的数据结果。表达式:处理输入文档并输出。表达式只能用于计算当前聚合管道的文档,不能处理其它的文档。
表达式 | 描述 |
---|---|
$sum | 计算总和 |
$avg | 计算平均值 |
$min | 获取集合中所有文档对应值得最小值 |
$max | 获取集合中所有文档对应值得最大值 |
$push | 在结果文档中插入值到一个数组中 |
$addToSet | 在结果文档中插入值到一个数组中,但数据不重复 |
$first | 根据资源文档的排序获取第一个文档数据 |
$last | 根据资源文档的排序获取最后一个文档数据 |
聚合管道:按照性别分组,求每组的个数
聚合管道:按照性别分组,将每组的薪资存放到一个数组中
聚合管道:按照性别分组,将每组的薪资不存放到一个数组中
MongoDB 中使用 db.COLLECTION_NAME.aggregate([{},…]) 方法来构建和使用聚合管道,每个文档通过一个由一个或者多个阶段(stage)组成的管道,经过一系列的处理,输出相应的结果。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
这里我们介绍一下聚合框架中常用的几个操作:
$group:将集合中的文档分组,可用于统计结果。$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。$limit:用来限制MongoDB聚合管道返回的文档数。$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。$sort:将输入文档排序后输出。$geoNear:输出接近某一地理位置的有序文档。
聚合管道:按照性别分组,求每组的薪资的平均值将第一个聚合操作的结果,使用管道的方式 将 结果传递给下一个聚合操作(更改字段别名)
聚合管道:按照性别分组,求每组的薪资的平均值将第一个聚合操作的结果,使用管道的方式 将 结果传递给下一个聚合操作(求评价薪资大于22222的分组)
db.lg_resume_preview.aggregate(
[{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{_id: "city",count:{KaTeX parse error: Expected 'EOF', got '}' at position 8: sum : 1}̲}}, {match:{count:{$gt:1}}}
])
2.3.5 MapReduce 编程模型
Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复杂的聚合逻辑。MongoDB不允许Pipeline的单个聚合操作占用过多的系统内存,如果一个聚合操作消耗20%以上的内存,那么MongoDB直接停止操作,并向客户端输出错误消息。
MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。
db.collection.mapReduce(
function() {emit(key,value);}, //map 函数
function(key,values) {return reduceFunction}, //reduce 函数
{
out: collection,
query: document,
sort: document,
limit: number,
finalize: ,
verbose:
}
)
使用 MapReduce 要实现两个函数 Map 函数和 Reduce 函数,Map 函数调用 emit(key, value), 遍历collection 中所有的记录, 将 key 与 value 传递给 Reduce 函数进行处理。
参数说明:
map:是JavaScript 函数,负责将每一个输入文档转换为零或多个文档,生成键值对序列,作为reduce 函数参数reduce:是JavaScript 函数,对map操作的输出做合并的化简的操作(将key-value变成key-values,也就是把values数组变成一个单一的值value)out:统计结果存放集合query: 一个筛选条件,只有满足条件的文档才会调用map函数。sort: 和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制limit: 发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大)finalize:可以对reduce输出结果再一次修改verbose:是否包括结果信息中的时间信息,默认为fasle
MapReduce 编程模型:以性别为key,薪资为value,进行map操作在reduce中进行求取薪资组的平均值最后输出
可以对reduce输出结果再一次修改
分布式文档存储独角兽MongoDB——MongoDB常见命令(2)相关推荐
- 分布式文档存储独角兽MongoDB——系统结构(1)
分布式文档存储独角兽MongoDB 一.MongoDB系统结构 1.1 NoSQL 和 MongoDB NoSQL=Not Only SQL,支持类似SQL的功能, 与Relational Datab ...
- 分布式文档存储MongoDB
MongoDB体系结构 MongoDB是一款高性能的NoSQL(Not Only SQL 不仅仅SQL)数据库 NoSQL 和 MongoDB NoSQL=Not Only SQL,支持类似SQL ...
- NoSQL生态系统——类似Bigtable列存储,或者Dynamo的key存储(kv存储如BDB,结构化存储如redis,文档存储如mongoDB)...
摘自:http://www.ituring.com.cn/article/4002# NoSQL系统的数据操作接口应该是非SQL类型的.但在NoSQL社区,NoSQL被赋予了更具有包容性的含义,其意为 ...
- 文档型非关系数据库MongoDB经验总结
文档型非关系数据库MongoDB 数据库基础概念 数据:能够输入到计算机中并被识别处理的信息集合 数据结构:研究一个数据集合中,数据元素关系 数据库:按照数据结构,存储管理数据的仓库.数据仓库是在数据 ...
- 五大存储模型关系模型、键值存储、文档存储、列式存储、图形数据
五大存储模型关系模型.键值存储.文档存储.列式存储.图形数据 时间:2014-06-12 16:15来源:知行网www.zhixing123.cn 编辑:麦田守望者 昨天跟一同事讨论Sybase是不是 ...
- 五大存储模型关系模型 键值存储 文档存储 列式存储 图形数据库
也可以认为是五大数据库存储模型. 数据库市场需要细分,行式数据库不再满足所有的需求,而有很多需求需要通过本内存数据库和列式数据库解决,列式数据库在数据分析.海量存储.BI这三个领域有自己独到. 1. ...
- 【S操作】简单粗暴自动化免费文档存储备份方案
微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 今天和大家分享一下我的文档存储备份方案:免费.轻松实现文档多重备份!再也不用U盘搬运存 ...
- 2020元旦快乐!简单粗暴自动化免费文档存储备份方案
今天和大家分享一下我的文档存储备份方案:免费.轻松实现文档多重备份!再也不用U盘搬运存储文档了,妈妈再也不用担心我的U盘丢了(或坏掉). 最终效果: 多地存储3重云端备份(我当前的文档存储方案是5地存 ...
- linux下,MySQL默认的数据文档存储目录为/var/lib/mysql。
0.说明 Linux下更改yum默认安装的mysql路径datadir. linux下,MySQL默认的数据文档存储目录为/var/lib/mysql. 假如要把MySQL目录移到/home/data ...
最新文章
- 通过用户名限制用户上网
- 18.虚拟机linux上网问题
- 怎么使用python中的字典_Python中字典的使用
- Linux下9个有用的touch命令示例
- 机器学习介绍jc01
- 《Effective C++》:条款46-条款47
- 深度学习代码实战——基于RNN的时间序列拟合(回归)
- Python zipfile – Python ZIP
- 帆软mysql迁移_平台数据迁移- FineReport帮助文档|报表开发|报表使用|学习教程
- 十三届蓝桥杯国赛 内存空间 python 满分答案
- 用html5写个炫酷的3d电子相册
- 虚拟人出新晋卷王,无薪工作70天却没人认出来
- chrome 浏览器中印象笔记·剪藏插件无法登陆问题
- RF(射频) - VSWR(电压驻波比)
- 《我的二本学生》的读后感5000字范文
- 微型计算机上的射箭成为什么,《说文解字》第429课:“谢”字里为什么有一个“射箭”的“射”...
- 【BZOJ】【P3110】【ZJOI2013】【K大数查询】【题解】【树套树】
- Javasctipt面试题整理
- 使用bable打包js
- oracle t7 1,Oracle SPARC t7-1服务器介绍及配置参数