MongoDB应用篇
一、高级查询
1. 查询操作符
1.1 比较操作符$gt,$lt,$gte,$lte
实例:
select * from things where field<value -- 等价于db.things.find({"field":{$lt:value}})select * from things where field<value2 and field>value1 -- 等价于db.things.find({"field":{$lt:value2,$gt:value1}})
1.2 $all匹配所有
这个操作符跟SQL 语法的in 类似,但不同的是, in 只需满足( )内的某一个值即可, 而$all 必须满足[ ]内的所有值,
例如:db.users.find({age:{$all:[6,8]}});可以查询出{name:'David',age:26,age:[6,8,9]}但查询不出{name:'David',age:26,age:[6,7,9]}
1.3 $exists判断字段是否存在
查询所有存在age 字段的记录:
db.users.find({age: {$exists: true}});
查询所有不存在name 字段的记录:
db.users.find({name: {$exists: false}});
1.4 $mod取模运算符
查询age 取模10 等于1 的数据:
db.student.find({age:{$mod:[10, 1]}})
1.5 $ne不等于
查询x 的值不等于3 的数据:
db.things.find( { x : { $ne : 3 } } );
1.6 $in/$nin包含/不包含
与sql 标准语法的用途是一样的,即要查询的是一系列枚举值的范围内查询x 的值在2,4,6 范围内的数据:
db.things.find({x:{$in: [2,4,6]}});
1.7 $size数据元素个数
对于{name: 'David', age: 26, favorite_number: [ 6, 7, 9 ] }记录匹配db.users.find({favorite_number: {$size: 3}});不匹配db.users.find({favorite_number: {$size: 2}});
1.8 正则表达式$not:/ * /
查询不匹配name=B*带头的记录:
select * from users where name not like 'B%'等价于db.users.find({name:{$not:/^B.*/}});
1.9 null值处理
db.users.find({age:null})这种查询会查出age为null的和没有age字段的json对象。可采用下面方法达到查询目的:
db.users.find({age:{"$in":[null], "$exists":true}})
1.10 Javascript查询和$where查询
查询a 大于3 的数据,下面的查询方法殊途同归:
db.c1.find( { a : { $gt: 3 } } );db.c1.find( { $where: "this.a > 3" } );db.c1.find("this.a > 3");f = function() { return this.a > 3; } db.c1.find(f);
1.11 count查询记录条数,limit限制返回记录数
count 查询记录条数:
db.users.find().count(); //全collection查询
注意:以下返回的是user 表中所有的记录数量:
db.users.find().skip(10).limit(5).count();
如果要返回限制之后的记录数量,要使用count(true)或者count(非0)
1.12 skip限制返回记录的起点
从第3 条记录开始,返回5 条记录:(limit 3, 5)等价于:
db.users.find().skip(3).limit(5);
1.13 sort 排序
以年龄升序ascdb.users.find().sort({age: 1});
以年龄降序descdb.users.find().sort({age: -1});
2 游标
MongoDB 也是用游标来循环处理每一条结果数据,典型用法如下:
for(var cursor=db.users.find();cursor.hasNext()){printjson(cursor.next())};db.users.find().forEach( function(u) { printjson(u); } );db.users.find().forEach(printjson);
1.3 存储过程
MongoDB 同样支持存储过程。关于存储过程你需要知道的第一件事就是它是用javascript 来写的。MongoDB 存储过程是存储在db.system.js 表中的。
- 第一步是定义函数:function addNumbers(x, y){return x+y;}
- 第二步是放入js表中:db.system.js.save({_id:"addNumbers",value:addNumbers})或db.system.js.save({_id:"addNumbers",value:function(x,y){return x+y;}})
- 第三步执行存储过程:db.eval('addNumbers(3,4)');
二、Capped Collection
1.简介
capped collections 是性能出色的有着固定大小的集合,以LRU(Least Recently Used 最近最少使用)规则和插入顺序进行age-out(老化移出)处理,自动维护集合中对象的插入顺序,在创建时要预先指定大小。如果空间用完,新添加的对象将会取代集合中最旧的对象。
2.功能特别
可以插入及更新,但更新不能超出collection 的大小,否则更新失败。不允许删除,但是可以调用drop() 删除集合中的所有行,但是drop 后需要显式地重建集合。在32 位机上,一个capped collection 的最大值约为482.5M,64 位上只受系统文件大小的限制。
3. 常见用处
- loggingMongoDB 中日志机制的首选,MongoDB 没有使用日志文件,而是把日志事件存储在数据库中。在一个没有索引的capped collection 中插入对象的速度与在文件系统中记录日志的速度相当。
- cache缓存一些对象在数据库中,比如计算出来的统计信息。这样的需要在collection 上建立一个索引,因为使用缓存往往是读比写多。
- auto archiving可以利用capped collection 的age-out 特性,省去了写cron 脚本进行人工归档的工作。
4. 推荐用法
- 为了发挥capped collection 的最大性能,如果写比读多,最好不要在上面建索引,否则插入速度从"log speed"降为"database speed"。
- 使用"nature ordering"可以有效地检索最近插入的元素,因为capped collection 能够保证自然排序就是插入时的顺序,类似于log 文件上的tail 操作。
5. 注意事项
- 可以在创建capped collection 时指定collection 中能够存放的最大文档数。但这时也要指定size,因为总是先检查size 后检查maxRowNumber。可以使用validate()查看一个collection已经使用了多少空间,从而决定size 设为多大。如:db.createCollection("mycoll", {capped:true, size:100000, max:100});db.mycoll.validate();max=1 时会往collection 中存放尽量多的documents。
- 上述的createCollection 函数也可以用来创建一般的collection , 还有一个参数"autoIndexID",值可以为"true"和"false"来决定是否需要在"_id"字段上自动创建索引,如:db.createCollection("mycoll", {size:10000000, autoIndexId:false})。默认情况下对一般的collection 是创建索引的,但不会对capped collection 创建。
三、GridFS
GridFS 是一种将大型文件存储在MongoDB 数据库中的文件规范。所有官方支持的驱动均实现了GridFS 规范。
1. 为什么使用GridFS?
由于MongoDB 中BSON 对象大小是有限制的,所以GridFS 规范提供了一种透明的机制,可以将一个大文件分割成为多个较小的文档,这样的机制允许我们有效的保存大文件对象,特别对于那些巨大的文件,比如视频、高清图片等。
2. 如何实现海量存储?
为实现这点,该规范指定了一个将文件分块的标准。每个文件都将在文件集合对象中保存一个元数据对象,一个或多个chunk 块对象可被组合保存在一个chunk 块集合中。大多数情况下,你无需了解此规范中细节,而可将注意力放在各个语言版本的驱动中有关GridFS API 的部分或是如何使用mongofiles 工具上。
3. 简单介绍
GridFS 使用两个表来存储数据:
- files 包含元数据对象
- chunks 包含其他一些相关信息的二进制块
为了使多个GridFS 命名为一个单一的数据库,文件和块都有一个前缀,默认情况下,前缀是fs,所以任何默认的GridFS 存储将包括命名空间fs.files 和fs.chunks。各种第三方语言的驱动有权限改变这个前缀。
4.命令行工具
mongofiles [-options] [list|search|put|get]
5. 索引
db.fs.chunks.ensureIndex({files_id:1, n:1}, {unique: true});
这样,一个块就可以利用它的files_id 和 n 的值进行检索。注意,GridFS 仍然可以用findOne得到第一个块,如下:
db.fs.chunks.findOne({files_id: myFileID, n: 0});
四、MapReduce
MongoDB 的MapReduce 相当于Mysql 中的"group by",所以在MongoDB 上使用 Map/Reduce进行并行"统计"很容易。
使用MapReduce 要实现两个函数 Map 函数和Reduce 函数,Map 函数调用emit(key, value),遍历collection中所有的记录,将key与value传递给Reduce 函数进行处理。Map函数和Reduce函数可以使用JavaScript 来实现,可以通过db.runCommand 或mapReduce 命令来执行一个MapReduce 的操作:
1 db.runCommand({ 2 mapreduce : , 3 map : , 4 reduce : 5 [, query : ] 6 [, sort : ] 7 [, limit : ] 8 [, out : ] 9 [, keeptemp: ]10 [, finalize : ]11 [, scope : ]12 [, verbose: ]13 })
转载于:https://www.cnblogs.com/oubo/archive/2012/02/22/2394665.html
MongoDB应用篇相关推荐
- MongoDB一篇从入门到实战
目录 MongoDB 数据库介绍 01.MongoDB简介 1.性能高 2.支持分布式 3.安装和部署容易 4.便于开发 5.NOSQL与SQL对比 02.文档存储结构 1.键值对 2.文档 3.集合 ...
- mangodb 高频数据_【mongoDB高级篇③】综合实战(1): 分析国家地震数据
数据准备 通过navicat导入到数据库,方便和mysql语句做对比 shard分片集群配置 # step 1 mkdir -p ./data/shard/s0 ./data/shard/s1 #创建 ...
- 本地储存数据_你的爬虫数据储存在哪?MongoDB入门篇
我们之前做的项目都是以文本或者 csv 文件保存在本地,如果保存的数据量比较大的话,保存在本地就不够灵活了.这边文章带大家入门怎么用 MongoDB 来储存爬虫的数据. MongoDB 是一个基于分布 ...
- mongodb 默认端口号_你的爬虫数据储存在哪?MongoDB入门篇
我们之前做的项目都是以文本或者 csv 文件保存在本地,如果保存的数据量比较大的话,保存在本地就不够灵活了.这边文章带大家入门怎么用 MongoDB 来储存爬虫的数据. MongoDB 是一个基于分布 ...
- 【MongoDB】MongoDB入门篇,修行靠自学
[MongoDB]入门篇MongoDB,修行靠自学 [此为学习笔记,后续会持续更新] 一 简介 1.1 网址 版本:https://www.mongodb.com/try/download/commu ...
- 云原生中间件 -- MongoDB Operator 篇
近年来,在容器技术.开源和微服务等云原生相关理念的发展带动下,将应用部署到云上已经是大势所趋.而企业用户在现有应用业务逻辑不变时,进行应用系统无缝入云的过程中,中间件起到了应用赋能.支持上层应用等至关 ...
- 你的爬虫数据储存在哪?MongoDB入门篇
点击上方"brucepk",选择"置顶公众号" 第一时间关注 Python 技术干货! " 阅读文本大概需要 3.1 分钟 我们之前做的项目都是以 ...
- MongoDB 入门篇
1.1 数据库管理系统 在了解MongoDB之前需要先了解先数据库管理系统 1.1.1 什么是数据? 数据(英语:data),是指未经过处理的原始记录. 一般而言,数据缺乏组织及分类,无法明确的表达事 ...
- MongoDB应用篇(转)
一.高级查询 1. 查询操作符 1.1 比较操作符$gt,$lt,$gte,$lte 实例: select * from things where field<value -- 等价于db.th ...
- MongoDB干货篇之查询数据
在开始之前我们应该先准备数据方便演示,这里我插入的了几条数据,数据如下: db.user.insertMany( [{ name:'jack', age:22, sex:'Man', tags:['p ...
最新文章
- legend3---laravel验证码使用
- SQL 必知必会·笔记9使用子查询
- 细胞自动机 通用计算机,细胞自动机
- halcon找矩形顶点的一种方法
- jQuery选择器总结[转]
- 【Python】直接赋值,深拷贝和浅拷贝
- 内置模块/核心模块 (自带的) --fs 文件系统
- filter过滤器_不了解布隆过滤器?一文给你整的明明白白
- java list 命名空间,Spring JAVA 不同类加载器命名空间的理解
- python集合_Python集合
- iOS开发第三方篇——友盟的哪些坑
- 2021年全球电力线通信(PLC)系统收入大约7385.8百万美元,预计2028年达到14530百万美元,2022至2028期间,年复合增长率CAGR为11.0%
- PlatformIO开发STM8S003F3P6
- 软件项目风险管理(Project Risk Management)
- Kafka 客户端 org.apache.kafka:kafka-clients:2.4.1
- 如何用Python网络爬虫爬取网易云音乐歌词
- 超全的iOS面试题汇总
- bt面板增加多个站点用同一个IP
- 只是你没那么重要罢了
- java新版本新特性