MongoDB应用篇(转)

时间:2023-02-22 23:12:22

一、高级查询

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得到第一个块,如下:

1
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 的操作:

MongoDB应用篇(转)
 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 })
MongoDB应用篇(转)

原文地址:http://www.cnblogs.com/oubo/archive/2012/02/22/2394665.html

MongoDB应用篇(转)的更多相关文章

  1. MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划

    这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...

  2. MongoDB 复制篇

    mongoDB 复制篇 复制集简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写 ...

  3. MongoDB 索引篇

    MongoDB 索引篇 索引的简介 索引可以加快查询的速度,但是过多的索引或者规范不好的索引也会影响到查询的速度.且添加索引之后的对文档的删除,修改会比以前速度慢.因为在进行修改的时候会对索引进行更新 ...

  4. 【mongoDB高级篇③】综合实战&lpar;1&rpar;&colon; 分析国家地震数据

    数据准备 下载国家地震数据 http://data.earthquake.cn/data/ 通过navicat导入到数据库,方便和mysql语句做对比 shard分片集群配置 # step 1 mkd ...

  5. node&period;js操作数据库之MongoDB&plus;mongoose篇

    前言 node.js的出现,使得用前端语法(javascript)开发后台服务成为可能,越来越多的前端因此因此接触后端,甚至转向全栈发展.后端开发少不了数据库的操作.MongoDB是一个基于分布式文件 ...

  6. mongodb入门篇

    MongoDB 入门篇 分类: NoSQL, 故障解决 undefined 1.1 数据库管理系统 在了解MongoDB之前需要先了解先数据库管理系统 1.1.1 什么是数据? 数据(英语:data) ...

  7. MongoDB安装篇-Win7 X64

    介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库 ...

  8. Mongodb高级篇-性能优化

    1.监控 mongodb可以通过profile来监控数据,进行优化. 查看当前是否开启profile功能用命令:db.getProfilingLevel()返回level等级,值为0|1|2,分别代表 ...

  9. mongodb优化篇

    在掌握了mongo的体系结构和基本操作后,开始学习 mongodb的优化,由于资源有限,只能网络上整理一些资料,我大致理解的mongo的优化分为以下几步:  1.监控 mongodb可以通过profi ...

  10. mongodb基础篇

    一.  关于mongodb 两种非关系数据库 Redis:满足极高读写性能的Key-Value数据库 键值式储存,可以通过键快速查询到值. 内存数据库,类似于mencached.性能出色.容量低,不具 ...

随机推荐

  1. mydumper 安装报错处理

    mydumper 官网:https://launchpad.net/mydumper 下载之后,安装报错: [root@localhost local]# cd mydumper-0.6.2 [roo ...

  2. HTML5手机APP开发入门&lpar;1&rpar;

    HTML5手机APP开发入门(1) 开发框架 Ionicframework V2 + Angular 2 具体内容可以参考一下网站 http://ionicframework.net/ http:// ...

  3. 阿里与腾讯&OpenCurlyDoubleQuote;智慧城市”的O2O谁更强?(分享)

    成都亿合科技:本月22日蚂蚁金服联合新浪微博宣布“智慧城市”战略,用户可通过新浪微博.手机淘宝.支付宝三大客户端完成医疗.市政缴费以及相关信息查询工作,首批入驻城市有上海.太原.深圳.青岛等12个城市 ...

  4. C&plus;&plus;学习笔记15:操作符重载的函数原型列表(推荐)

    //普通四则运算 friend A operator +(const A & lhs, const A & rhs); friend A operator -(const A &amp ...

  5. &lbrack;ionic开源项目教程&rsqb; - 第1讲 前言&comma;技术储备&comma;环境搭建&comma;常用命令

    前言 这是一个系列文章,将持续更新到项目完结,从环境搭建开始讲解,包括实战开发中遇到的各种问题的解决方案,都将毫无保留的分享给大家. 技术储备 开始本项目之前,请确保自己对以下技术点都有所了解. ht ...

  6. Classifier4J的中文支持

    Classifier4J是一个轻量级的分类工具,支持贝叶斯分类.向量空间模型.信息摘要等.然而它却不支持中文,异常信息大致如下: Exception in thread "main&quot ...

  7. linux下http服务器开发

    linux下http服务器开发 1.mystery引入 1)超文本传输协议(HTTP)是一种应用于分布式.合作式.多媒体信息系统的应用层协议 2)工作原理 1)客户端一台客户机与服务器建立连接后,会发 ...

  8. offset,client,scroll,style相关笔记

    1.offsetTop 功能:获取元素上外缘与最近的定位父元素内壁的距离,如果没有定位父元素,则是与文档上内壁的距离 使用方法:js document.querySelector(...).offse ...

  9. Python学习笔录

    参考:http://www.runoob.com/python3/python3-data-type.html 1. type和isinstance区别type(A()) == A, type()不会 ...

  10. &lbrack;转&rsqb;double与BigDecimal

    转自:http://superivan.iteye.com/blog/963628 [1] 精确的浮点运算: 在Java里面,有时候为了保证数值的准确性需要精确的数据,先提供一个例子就可以发现问题了: ...