一、高级查询

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 表中的。

  1. 第一步是定义函数:function addNumbers(x, y){return x+y;}
  2. 第二步是放入js表中:db.system.js.save({_id:"addNumbers",value:addNumbers})或db.system.js.save({_id:"addNumbers",value:function(x,y){return x+y;}})
  3. 第三步执行存储过程: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. 常见用处

  1. loggingMongoDB 中日志机制的首选,MongoDB 没有使用日志文件,而是把日志事件存储在数据库中。在一个没有索引的capped collection 中插入对象的速度与在文件系统中记录日志的速度相当。
  2. cache缓存一些对象在数据库中,比如计算出来的统计信息。这样的需要在collection 上建立一个索引,因为使用缓存往往是读比写多。
  3. auto archiving可以利用capped collection 的age-out 特性,省去了写cron 脚本进行人工归档的工作。

4. 推荐用法

  1. 为了发挥capped collection 的最大性能,如果写比读多,最好不要在上面建索引,否则插入速度从"log speed"降为"database speed"。
  2. 使用"nature ordering"可以有效地检索最近插入的元素,因为capped collection 能够保证自然排序就是插入时的顺序,类似于log 文件上的tail 操作。

5. 注意事项

  1. 可以在创建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。
  2. 上述的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应用篇相关推荐

  1. MongoDB一篇从入门到实战

    目录 MongoDB 数据库介绍 01.MongoDB简介 1.性能高 2.支持分布式 3.安装和部署容易 4.便于开发 5.NOSQL与SQL对比 02.文档存储结构 1.键值对 2.文档 3.集合 ...

  2. mangodb 高频数据_【mongoDB高级篇③】综合实战(1): 分析国家地震数据

    数据准备 通过navicat导入到数据库,方便和mysql语句做对比 shard分片集群配置 # step 1 mkdir -p ./data/shard/s0 ./data/shard/s1 #创建 ...

  3. 本地储存数据_你的爬虫数据储存在哪?MongoDB入门篇

    我们之前做的项目都是以文本或者 csv 文件保存在本地,如果保存的数据量比较大的话,保存在本地就不够灵活了.这边文章带大家入门怎么用 MongoDB 来储存爬虫的数据. MongoDB 是一个基于分布 ...

  4. mongodb 默认端口号_你的爬虫数据储存在哪?MongoDB入门篇

    我们之前做的项目都是以文本或者 csv 文件保存在本地,如果保存的数据量比较大的话,保存在本地就不够灵活了.这边文章带大家入门怎么用 MongoDB 来储存爬虫的数据. MongoDB 是一个基于分布 ...

  5. 【MongoDB】MongoDB入门篇,修行靠自学

    [MongoDB]入门篇MongoDB,修行靠自学 [此为学习笔记,后续会持续更新] 一 简介 1.1 网址 版本:https://www.mongodb.com/try/download/commu ...

  6. 云原生中间件 -- MongoDB Operator 篇

    近年来,在容器技术.开源和微服务等云原生相关理念的发展带动下,将应用部署到云上已经是大势所趋.而企业用户在现有应用业务逻辑不变时,进行应用系统无缝入云的过程中,中间件起到了应用赋能.支持上层应用等至关 ...

  7. 你的爬虫数据储存在哪?MongoDB入门篇

    点击上方"brucepk",选择"置顶公众号" 第一时间关注 Python 技术干货! "   阅读文本大概需要 3.1 分钟 我们之前做的项目都是以 ...

  8. MongoDB 入门篇

    1.1 数据库管理系统 在了解MongoDB之前需要先了解先数据库管理系统 1.1.1 什么是数据? 数据(英语:data),是指未经过处理的原始记录. 一般而言,数据缺乏组织及分类,无法明确的表达事 ...

  9. MongoDB应用篇(转)

    一.高级查询 1. 查询操作符 1.1 比较操作符$gt,$lt,$gte,$lte 实例: select * from things where field<value -- 等价于db.th ...

  10. MongoDB干货篇之查询数据

    在开始之前我们应该先准备数据方便演示,这里我插入的了几条数据,数据如下: db.user.insertMany( [{ name:'jack', age:22, sex:'Man', tags:['p ...

最新文章

  1. legend3---laravel验证码使用
  2. SQL 必知必会·笔记9使用子查询
  3. 细胞自动机 通用计算机,细胞自动机
  4. halcon找矩形顶点的一种方法
  5. jQuery选择器总结[转]
  6. 【Python】直接赋值,深拷贝和浅拷贝
  7. 内置模块/核心模块 (自带的) --fs 文件系统
  8. filter过滤器_不了解布隆过滤器?一文给你整的明明白白
  9. java list 命名空间,Spring JAVA 不同类加载器命名空间的理解
  10. python集合_Python集合
  11. iOS开发第三方篇——友盟的哪些坑
  12. 2021年全球电力线通信(PLC)系统收入大约7385.8百万美元,预计2028年达到14530百万美元,2022至2028期间,年复合增长率CAGR为11.0%
  13. PlatformIO开发STM8S003F3P6
  14. 软件项目风险管理(Project Risk Management)
  15. Kafka 客户端 org.apache.kafka:kafka-clients:2.4.1
  16. 如何用Python网络爬虫爬取网易云音乐歌词
  17. 超全的iOS面试题汇总
  18. bt面板增加多个站点用同一个IP
  19. 只是你没那么重要罢了
  20. java新版本新特性

热门文章

  1. 2021Java就业笔试题总结
  2. 常见Java面试题之和的区别?
  3. 独立主机如何,不要被人忽悠了
  4. UNDO Retntion
  5. Oracle10g中OEM相关问题
  6. AlertView动画
  7. 第12章 与Spring集成
  8. 分块读取Blob字段数据(Oracle)
  9. InnoDB与MyISAM的六大区别(转)
  10. c语言入门中冒泡排序的例题,选择排序和冒泡排序例题解析(c语言)