正则表达式在所有语言当中都是经常会用到的一个功能,可以用来搜索模式或字符串中的单词。MongoDB 也提供了这一功能,使用 $regex 运算符来匹配字符串模式。MongoDB 使用 PCRE(可兼容 Perl 的正则表达式)作为正则表达式语言。 与文本搜索不同,使用正则表达式不需要使用任何配置或命令。 假如 posts 集合有下面这个文档,它包含着帖子文本及其标签。
MongoDB 从 2.4 版本起就开始支持全文索引,以便搜索字符串内容。文本搜索使用字干搜索技术查找字符串字段中的指定词语,丢弃字干停止词(比如 a、an、the等)。迄今为止,MongoDB 支持大约 15 种语言。 启用文本搜索最初的文本搜索只是一种试验性功能,但从 2.6 版本起就成为默认功能了。但如果使用的是之前的 MongoDB,则需要使用下列代码启用文本搜索: >db.
在 MongoDB 文档中,Map-Reduce(映射归约)是一种将大量数据压缩成有用的聚合结果的数据处理范式。MongoDB 使用 mapReduce 命令来实现映射归约操作。映射归约通常用来处理大型数据。 映射归约命令mapReduce 命令的基本格式为: >db.collection.mapReduce( function() {emit(key,value);
前面的几章中都涉及到了 MongoDB 的对象 id。本章将介绍 ObjectId 的结构。 ObjectId 是一个 12 字节的 BSON 类型,其结构如下: 前 4 个字节代表 UNIX 的时间戳(以秒计)。 接下来的 3 个字节代表机器标识符。 接下来的 2 个字节代表进程 id。 最后 3 个字节代表随机数。 MongoDB 使用 ObjectId 作为每一文档的 _id 字段的默认值(在创建文档时产生)。
额外开销每个索引都会占据一些空间,从而也会在每次插入、更新与删除操作时产生一定的开销。所以如果集合很少使用读取操作,就尽量不要使用索引。 内存使用因为索引存储在内存中,所以应保证索引总体的大小不超过内存的容量。如果索引总体积超出了内存容量,就会删除部分索引,从而降低性能。
假如一个 users 集合中具有下列文档: { "address": { "city": "Los Angeles", "state": "California", "pincode": "123" }, "tags": [ "music", "cricket", "blogs" ], "name": "Tom Benzamin"}上述文档包含一个地址子文档(address sub-document)与一个标签数组(tags array)。
MongoDB 并不支持多文档原子事务(multi-document atomic transactions)。但它提供了针对单个文档的原子操作。假如一个文档包含数百个字段,则 update 语句将更新所有的字段,或者一个也不更新,从而维持了文档级的原子性。 原子操作数据模型维持原子性的建议方法是利用内嵌文档(embedded document)将所有经常更新的相关信息都保存在一个文档中。
对于衡量数据库及索引设计的效率来说,分析查询是一个很重要的衡量方式。经常使用的查询有 $explain 和 $hint。 使用 $explain$explain 操作提供的消息包括:查询消息、查询所使用的索引以及其他的统计信息。在分析索引优化方案时,这是一个非常有用的工具。 在上一节中,我们使用如下查询,针对 users 集合的字段 gender 和 user_name 创建了索引: >db.users.
何为覆盖查询在每一个 MongoDB 官方文档中,覆盖查询都具有以下两个特点: 查询中的所有字段都属于一个索引; 查询所返回的所有字段也都属于同一索引内。 既然查询中的所有字段都属于一个索引,MongoDB 就会利用同一索引,匹配查询集合并返回结果,而不需要实际地查看文档。因为索引存在于 RAM 中,从索引中获取数据要比通过扫描文档获取数据快得多。
在上一节中,我们使用引用关系实现了归一化的数据库结构,这种引用关系也被称作手动引用,即可以手动地将引用文档的 id 保存在其他文档中。但在有些情况下,文档包含其他集合的引用时,我们可以使用数据库引用(MongoDB DBRefs)。 数据库引用 vs 手动引用我们将利用一个例子来展示如何用数据库引用代替手动引用。
MongoDB 中的关系表示文档之间的逻辑相关方式。关系可以通过内嵌(Embedded)或引用(Referenced)两种方式建模。这样的关系可能是 1:1、1:N、N:1,也有可能是 N:N。 先来考虑保存用户地址的例子。一个用户可能有多个地址,这是一个 1:N 的关系。 下面是一个结构非常简单的 user 文档。
要想在 MongoDB 上使用 PHP,需要使用 mongodb PHP 驱动。从该链接处下载 PHP 驱动。确保下载的是最新版。将其解压缩,并将 php_mongo.dll 文件放到 PHP 扩展目录中(默认为 “ext”),然后把下列代码放到 php.ini 文件中: extension=php_mongo.dll 创建连接并选择数据库创建连接需要指定数据库名称,如果数据库不存在,则 mongodb 会自动创建它。
安装要想在 Java 程序中使用 MongoDB,需要先确定是否安装了 MongoDB JDBC 驱动,并且要在机器上安装了 Java。查看 Java 教程来确保在机器上安装好 Java。下面来介绍如何安装 MongoDB JDBC 驱动。 从路径 Download mongo.jar 处下载 jar 文件,注意下载最新版本。 在类路径中包括 mongo.jar 文件。
在准备一个 MongoDB 部署时,应该先了解一下应用是如何在生产环境中运行的。使用一个持久性可重复的策略来管理部署环境无疑是很有用的,它将减少你在生产环境中遇到意外麻烦的可能性。最佳的策略应包括以下几点:规划设置原型,执行负载测试,监控关键参数,并使用该信息来扩展设置。
MongoDB 数据转储为了在 MongoDB 中创建数据库备份,需要使用 mongodump 命令。该命令会将服务器上的所有数据都转储到 dump 目录中。你可以使用很多选项来限制转储的数据量,或者创建远程服务器备份。 格式mongodump 命令的基本语法格式为: >mongodump 范例开启 mongod 服务器。假设 mongod 服务器运行在 localhost 上,端口为 27017。
分片是一种在多台机器上存储数据记录的操作,它是 MongoDB 为应对数据增长需求而采取的办法。当数据量增长时,单台机器有可能无法存储数据或可接受的读取写入吞吐量。通过横向扩展,分片技术解决了这个问题。利用分片技术,我们可以添加更多的机器来应对数据量增加以及读写操作的要求。
复制是一种在多个服务器上同步数据的过程。通过在不同的数据库服务器上实现多个数据副本,复制能够实现数据冗余,提高数据的可用性,从而避免了仅仅因为一台服务器故障后就会产生的数据库灾难。总之,复制可以使你免受硬件故障与服务中断的影响,及时恢复数据。由于数据有多个副本,所以可以将其中一个副本用于灾难恢复、报告或备份。
聚合操作能够处理数据记录并返回计算结果。聚合操作能将多个文档中的值组合起来,对成组数据执行各种操作,返回单一的结果。它相当于 SQL 中的 count(*) 组合 group by。 aggregate() 方法对于 MongoDB 中的聚合操作,应该使用 aggregate() 方法。 语法格式aggregate() 方法中的基本格式如下所示: >db.COLLECTION_NAME.
索引能够实现高效地查询。没有索引,MongoDB 就必须扫描集合中的所有文档,才能找到匹配查询语句的文档。这种扫描毫无效率可言,需要处理大量的数据。 索引是一种特殊的数据结构,将一小块数据集保存为容易遍历的形式。索引能够存储某种特殊字段或字段集的值,并按照索引指定的方式将字段值进行排序。
sort() 方法MongoDB 中的文档排序是通过 sort() 方法来实现的。sort() 方法可以通过一些参数来指定要进行排序的字段,并使用 1 和 -1 来指定排序方式,其中 1 表示升序,而 -1 表示降序。 格式sort() 方法基本格式为: >db.COLLECTION_NAME.find().
关注时代Java