-
本帖最后由 昵称 于 2018-5-6 20:50 编辑此文档介绍了部署MongoDB服务时,需要进行的安全检查项。 启用访问控制并强制进行身份验证 启用访问控制并指定身份验证机制。您可以使用MongoDB 默认的身份验证机制或现有的外部框架。身份验证要求所有客户端和服务器都提供有效的凭据才能连接到系统。在群集部署中, 为每个 MongoDB 服务器都启用身份验证。 配置基于角色的访问控制 首先创建用户管理员, 然后创建其他用户。为访问系统的每个人和应用程序创建唯一的 MongoDB 用户。创建定义一组用户需要的确切访问权限的角色。遵循最小特权原则。然后创建用户, 并仅为他们分配执行其操作所需的角色。用户可以是个人或客户端应用程序。 加密通信 配置 MongoDB 对所有传入和传出连接使用 TLS/SSL。使用 TLS/SSL 可以加密部署的mongod 和mongos 服务器和所有应用程序之间的通信。 加密和保护数据 从 MongoDB 企业版3.2 开始, WiredTiger 存储引擎基于REST加密可以配置为对存储层中的数据进行加密。如果您没有基于REST加密使用 WiredTiger, 则应使用文件系统、设备或物理加密,在每个主机上加密 MongoDB 数据。使用文件系统权限保护 MongoDB 数据。MongoDB 数据包括数据文件、配置文件、审计日志和密钥文件。 限制网络暴露 确保 MongoDB 在受信任的网络环境中运行, 并限制 MongoDB 实例侦听传入连接的接口。仅允许受信任的客户端访问 MongoDB 实例可用的网络接口和端口。 从 MongoDB 3.6 开始, MongoDB 二进制文件, mongod 和mongos服务器,默认情况下绑定到本地主机, 从 MongoDB 2.6 开始, 只有从官方 MongoDB RPM (Red Hat, CentOS, Fedora Linux) 和 DEB (Debian, Ubuntu) 的二进制文件默认情况下绑定到本地主机。 审计系统活动 跟踪对数据库配置和数据的访问和更改。MongoDB版包括可在 MongoDB 实例上记录系统事件 (例如用户操作、连接事件) 的系统审核工具。这些审计记录允许分析, 并允许管理员验证适当的控制。 使用专用操作系统用户运行 MongoDB 使用专用操作系统用户运行 MongoDB 进程。确保该用户具有访问数据但没有不必要的权限。 使用安全配置选项运行 MongoDB [*]MongoDB 支持执行某些服务器端操作的JavaScript 代码: 如mapReduce,group, $where。如果不必使用这些操作, 请使用命令行上的 -noscripting选项禁用服务器端脚本。 [*]仅在生产部署中使用 MongoDB wire协议。 [*]保持输入验证已启用。MongoDB 通过 wireObjectCheck设置默认启用输入验证。这可确保实例存储的所有文档都是有效的BSON文档。 安全技术实施指南 (如果适用) "安全技术实施指南"(STIG) 包含美国国防部内部发布的安全指南。MongoDB 公司根据要求提供其STIG。 考虑安全标准合法性 对于需要 HIPAA 或 PCI DSS 法规遵从性的应用程序, 可参阅MongoDB 安全参考体系结构, 了解有关如何使用密钥安全功能构建兼容的应用程序基础结构。
-
本帖最后由 Mongo_奇 于 2018-5-6 18:54 编辑MongoDB 允许多个客户端读取和写入相同的数据。面对大量的并发,MongoDB如何保持其数据一致性呢?这里将会介绍MongoDB的锁机制(基于3.2版本)。 MongoDB的锁可以分为四个粒度: Global:全局锁 Database:数据库锁 Collection:集合锁 Document: 文档锁(存储引擎实现) MongoDB的锁可以分为四个类型: R读锁(共享锁)W写锁(排它锁)r意向读锁(意向共享锁)w意向写锁(意向排它锁)这四种锁类型很好理解: 读锁是在读取时添加的锁,加了读锁的资源同时也可以被其它读操作读取。 写锁是在有写操作时加的锁,加了写锁的资源不允许被其它写操作修改。 意向读锁表示该锁持有者将以更细的粒度读取该资源。比如,数据库的意向读锁意味着,它将会读取数据库中的集合或文档。 意向写锁表示该锁持有者将以更细的粒度写入该资源。比如,数据库的意向写锁意味着,它将会在数据库中的集合或者文档进行写入操作。 举个例子,当要在集合中进行写入时: 1. 首先获取全局的意向写锁,为了在更细粒度(数据库/集合/文档) 中应用写操作。 2. 获取数据库级别的意向写锁,为了在(集合/文档)中应用写操作。 3. 获取集合的写锁,为了在集合中应用写操作。 那么对于加锁有怎样的限制呢?可以参考下图理解: 14877
-
本帖最后由 自在极意 于 2018-5-7 15:10 编辑WireTiger是Mongodb的默认存储引擎,可在mongod服务启动时指定存储引擎 mongod --storageEngine mmapv1 wireTiger允许多个客户端同时对同一个集合不同文档进行写操作,避免不了出现多线程读写数据产生冲突的情况,wireTiger使用乐观并发控制的形式(悲观并发控制即加锁,乐观并发控制不加锁,但写入的时候若有其他修改,需要手动解决冲突,如git push解决conflict,wireTiger的解决冲突方法就是给一个操作返回写失败)。 wireTiger磁盘文件组织形式如下所示,存储压缩后的集合和索引。 $tree . ├── admin │ ├── collection-11--5764503550749656746.wt │ ├── collection-14--6907424972913303461.wt │ ├── collection-16--6907424972913303461.wt │ ├── collection-20--6907424972913303461.wt │ ├── collection-8--6907424972913303461.wt │ ├── collection-9--5764503550749656746.wt │ ├── index-10--5764503550749656746.wt │ ├── index-12--5764503550749656746.wt │ ├── index-13--5764503550749656746.wt │ ├── index-15--6907424972913303461.wt │ ├── index-17--6907424972913303461.wt │ └── index-9--6907424972913303461.wt ├── journal │ ├── WiredTigerLog.0000000003 │ └── WiredTigerPreplog.0000000001 ├── local │ ├── collection-0--5764503550749656746.wt │ ├── collection-2--5764503550749656746.wt │ ├── collection-4--5764503550749656746.wt │ ├── collection-6--5764503550749656746.wt │ ├── collection-7--5764503550749656746.wt │ ├── index-1--5764503550749656746.wt │ ├── index-3--5764503550749656746.wt │ ├── index-5--5764503550749656746.wt │ └── index-8--5764503550749656746.wt ├── _mdb_catalog.wt ├── mongod.lock ├── products │ ├── collection-6--6907424972913303461.wt │ └── index-7--6907424972913303461.wt ├── sizeStorer.wt ├── storage.bson ├── WiredTiger ├── WiredTiger.basecfg ├── WiredTiger.lock ├── WiredTiger.turtle └── WiredTiger.wt 当用户需要进行增删改查操作时,mongodb数据会将相关collection数据从磁盘复制到内存,这些内存数据称为老检查点,在内存中再复制出一个副本用于修改操作,称为新检查点,修改后默认60秒进行磁盘写入,写入时先判断老检查点是否和磁盘数据一致(不一致可能是读磁盘时出问题),若一致则根据新检查点进行写操作,若写到一半失败了,则把老检查点的数据重新写到磁盘(相当于回滚),如果想恢复写失败前的数据,则需要使用日志,每个数据库都有一个jounal目录存放日志信息。若写到一半宕机了,则将副本集一个secondary升级到primary节点进行数据恢复。
-
本帖最后由 Nosql_newbee 于 2018-5-5 19:30 编辑mongodb数据分片: 除非明确指定规则,否则mongodb不会自动对数据进行拆分,如有必要,必须明确告知数据库和集合。 假设我们希望对music数据库中的artist集合按照name键进行分片,首先对music数据库启用分片: db.enableSharding("music") 对数据库分片是对集合分片的先决条件。 对数据启用分片后,就可以使用shardCollection()命令对集合进行分片了: sh.shardCollection("music.artists",{"name":1}) 现在,集合会按照name键进行分片。如果是对已存在的集合进行分片,那么name键上必须有索引,否则shardCollection()返回错误。如果出现了错误,就先创建索引(mongos会建议创建的索引作为错误消息的一部分返回),然后重试。 如果是新的集合,mongos会自动在片键上创建索引。shardCollection()命令会将集合拆分为多个数据块,这是MongoDB迁移数据的基本单元,命令成功执行后,MongoDB会均衡的讲集合数据分散到集群的分片上,对于比较大的集合,可能会花费几个小时才能完成。 流水策略 如果有一些服务器比其他服务器更强大,我们可能会希望让这些强大的服务器处理更多的负载。比如说,假如有一个使用SSD的分片能够处理10倍于其他机器的负载,如果有10个分片,可强制将所有新数据**到SSD,然后让均衡器将旧的块移动到其他分片上。为实现这种策略,需要将最大范围的块分布在SSD上,首先,为SSD指定一个标签: sh.addShardTag("shard-name","ssd") 将升序键的当前值也知道正无穷范围的块指定分布在SSD上,以便后续的写入请求均被分发到SSD分片上: sh.addTagRange("dbName.collName",{"_id":object()},{"_id":MaxKey},"ssd") 现在,所有的**请求都会被路由到这个块上,这个块始终位于标签为ssd的分片上。 但是,除非修改标签范围,否则从升序键的当前值一直到无穷的这个范围固定在这个分片上,可创建一个定时任务每天更新一次标签范围, use config var tag=db.tags.findOne({"ns":"dbName.collName","max":{"shardKey":MaxKey}}) tag.min.shardKey=objectId() db.tags.save(tag) 这样,前一天的块就可以被移动到其他分片上了。
Nosql_newbee 发表于2018-05-05 19:18:47 2018-05-05 19:18:47 最后回复 Nosql_newbee 2018-05-05 19:18:47
9763 0 -
均衡器(balancer)负责数据的迁移。它会周期性的检查分片间是否存在不均衡,如果存在,则会开始块的迁移。虽然均衡器通常被看做是单一实体,但每个mongos有时也会扮演均衡器的角色。 每隔几秒钟,mongos就会尝试变为均衡器,如果没有其他可用的均衡器,mongos就会对整个集群加锁,已防止配置服务器对集群进行修改,然后做一次均衡,均衡并不会影响mongos的正常操作,所以使用mongos的客户端不会受到影响。 查看config.locks集合,可以查到哪一个mongos是均衡器: use config mongos> db.locks.findOne({"_id":"balancer"}) { "_id" : "balancer", "state" : 0, "ts" : ObjectId("5aed7b24b88f3ea3e2307262"), "who" : "EulerOS-BaseTemplate:8637:1525499107:240928211:Balancer", "process" : "EulerOS-BaseTemplate:8637:1525499107:240928211", "when" : ISODate("2018-05-05T09:36:36.948Z"), "why" : "doing balance round" } config.locks 集合会追踪所有集群范围的锁,_id为balancer的文档就是均衡器。who为当前或者曾经作为均衡器的mongos是哪个,state字段表明均衡器是否正在运行:0表示处于非活动状态,2表示正在均衡(1表示mongos正在尝试得到锁,但还没有得到,通常不会看到状态1)。 mongos成为均衡器后,就会检查每个集合的分块表,看是否有分片达到了均衡阈值。不均衡的表现指,一个分片明显比其他分片拥有更多的快,如果检测到不均衡,均衡器就会开始对块进行再分布,使每个分片拥有数量相当的快,如果没有集合达到均衡阈值,mongos就不在充当均衡器的角色了。 有些集合到达了阈值,均衡器开始做迁移,它会从负载比较大的分片中选择一个块,并询问该分片是否需要在迁移之前对块进行拆分,完成必要的拆分后,就会将块迁移至数量较少的机器上。 使用集群的应用程序无需知道数据迁移,在数据迁移完成前,所有的读写请求都会路由到旧的块上,如果元数据更新完成,那么所有试图访问旧位置数据的mongos进程都会得到一个错误。这些错误应该对客户不可见,mongos会对这些错误进行静默处理,然后在新的分片上重新执行之前的操作。 有时会在mongos的日志中看到"unable to setShardVersion" 的信息,这是很常见的错误。mongos在收到这种错误时,会查看配置服务器数据的新位置,并更新块分布表,然后重新执行之前的请求。如果成功从新的位置得到了数据,则会将数据返回给客户,日志中会记录一条错误日志,用户的操作不受影响。 如果由于配置服务器不可用导致mongos无法获取块的新位置,则会向客户端返回错误。
Nosql_newbee 发表于2018-05-05 17:56:13 2018-05-05 17:56:13 最后回复 Nosql_newbee 2018-05-05 17:56:13
8450 0 -
本帖最后由 danglf 于 2018-5-5 17:43 编辑聚合操作处理数据记录并返回计算结果。汇总操作将来自多个文档的值组合在一起,并且可以对分组数据执行各种操作以返回单个结果。MongDB提供了三种执行聚合的方式:聚合 Pipeline,map-reduce功能和简单功能的聚合方法。 Aggregation Pipeline MongoDB的聚合框架是基于数据处理管道的概念建模的。文档输入一个多级流水线,将文档转换为汇总结果。 最基本的流水线阶段提供了像查询和文档转换一样操作的过滤器,这些过滤器修改了输出文档的形式。 其他流水线操作提供了按特定字段或字段分组和排序文档的工具,以及用于汇总数组内容(包括文档数组)的工具。另外,流水线阶段可以使用运算符执行任务,例如计算平均值或连接字符串。 该管道使用MongoDB中的本地操作提供有效的数据聚合,并且是MongoDB中数据聚合的首选方法。 聚合管道可以在分片集合上运行。聚合管道可以使用索引来改进其某些阶段的性能。 14872 Map-Reduce MongoDB还提供map-reduce操作来执行聚合。通常,map-reduce操作有两个阶段:处理每个文档并为每个输入文档发出一个或多个对象的映射阶段,以及减少组合地图操作输出的阶段。或者,map-reduce可以有一个finalize阶段来对结果进行最终修改。像其他聚合操作一样,map-reduce可以指定查询条件来选择输入文档以及对结果进行排序和限制。 Map-Reduce使用自定义JavaScript函数来执行映射和减少操作,以及可选的finalize操作。虽然自定义JavaScript与聚合流水线相比提供了很大的灵活性,但通常,map-reduce比聚合流水线效率更低且更复杂。 Map-reduce可以在分片集合上运行。映射减少操作也可以输出到分片集合。有关详细信息,请参阅集合流水线和分片集合以及映射简化和分片集合。 14873 单一功能聚合操作 MongoDB还提供了db.collection.count(),db.collection.group(),db.collection.distinct()。专用数据库命令。所有这些操作都汇总了单个集合中的文档。 虽然这些操作提供了对常见聚合流程的简单访问,但它们缺乏聚合流水线和map-reduce的灵活性和功能。 14874 参考链接 :MongoDB 聚合操作
-
本帖最后由 昵称 于 2018-5-1 12:58 编辑MongoDB将系统信息存放在如下格式 .system.* namespace的集合中,用作MongoDB服务内部使用,用户不要创建以system作为前缀的数据集合。 除此之卡,MongoDB也存放了一些实例的元数据在本地数据库。特别是在config数据库中存放了用于复制目的的会话信息。 1. 在admin数据库中有如下的系统集合:admin.system.roles(2.6版本新增)该集合存放的是用admin权限创建出来用户角色,在角色集合中指定用户可以访问的特定数据库以及具有特定命令权限。 admin.system.users(2.6版本变化)集合存放的是数据库用户的认证信息和用户对应的角色信息。可以在admin.system.roles中定义用户角色。14691 admin.system.version(2.6版本新增)存放用户认证文档的版本号。 2. 在每一个用户数据库中也存在如下系统集合:.system.namespaces(3.0版本已废弃,可以使用listCollections命令代替)该集合存放所在数据库下所有集合的名称信息14689 .system.indexes(3.0版本已废弃,可以使用listIndexs命令)该集合存放所在数据库下所有集合的索引信息14690 .system.profile该集合存放数据库的性能分析信息,主要用于慢日志分析。 .system.js存储特殊的JS代码块用于服务端处理。
-
本帖最后由 lipo 于 2018-5-15 20:26 编辑error
-
本帖最后由 小路~ 于 2018-4-27 19:17 编辑华为云MongoDB定价包括:在华南、华北、华东、东北地区定价 和 在香港地区定价在华南、华北、华东、东北地区定价(RMB):副本集14629集群14630单节点14631在香港地区定价(美元):集群14632
-
本帖最后由 danglf 于 2018-4-23 19:23 编辑mongostat 功能介绍mongostat实用程序提供了当前运行的mongod或mongos实例状态的快速概览。 mongostat在功能上类似于UNIX / Linux文件系统实用程序vmstat,但提供有关mongod和mongos实例的数据。 mongostat具体如何连接实例,本文就不讨论了,使用连接方式基本和mongo相同,重点介绍mongostat具体输出的每个字段的含义。mongostat统计的是1秒钟内操作的值。mongostat将统计数据平均以反映每秒的平均操作。14395 mongostat输出以下字段:inserts: 每秒**数据库的对象数量。如果后面跟着星号(例如*),则数据是指复制的操作。 query: 每秒查询操作的次数。 update:每秒更新操作的次数。 delete:每秒删除操作的数量。 getmore:每秒getmore操作的次数。 command:每秒命令的数量。 flushes:对于WiredTiger存储引擎,Flushes指的是触发的WiredTiger检查点的数量。 dirty: 仅适用于WiredTiger存储引擎,脏数据占整个缓存的百分比,由配置的cache / wiredTiger.cache.maximum字节中的wiredTiger.cache.tracked脏字节计算得出。 used:仅适用于WiredTiger存储引擎。正在使用的WiredTiger缓存的百分比,由当前配置的cache / wiredTiger.cache.maximum字节中的wiredTiger.cache.bytes计算。 vsize:最后一次mongostat调用时进程使用的以兆字节为单位的虚拟内存量。 qr:等待从MongoDB实例读取数据的客户端队列的长度。 qw:等待从MongoDB实例写入数据的客户端队列的长度。 ar:执行读取操作的活动客户端的数量。 aw:执行写入操作的活动客户端的数量。 netIn: MongoDB实例接收的网络流量(以字节为单位),这包括来自mongostat本身的流量。 netOut:由MongoDB实例发送的网络流量(以字节为单位),这包括来自mongostat本身的流量。
-
本帖最后由 昵称 于 2018-4-23 10:43 编辑在Spring工程开发中,使用spring-data-mongodb 工具去操作mongodb数据库是非常方便的一种方式。下面我们就在数据库非SSL形式下。以3种配置的方式。去连接mongodb数据库并进行操作演示。本文spring-data-mongodb版本1.8.4.RELEASE, mongodb-driver 版本3.2.2。 简单配置(第一种方式): 1、POM文件中引入依赖: [code] org.springframework.data spring-data-mongodb 1.8.4.RELEASE org.mongodb mongodb-driver 3.2.2 [/code]2、Spring配置文件: config.properties: [code]db.url=mongodb://rwuser:Hello123!@***:8635/hello?authSource=admin [/code]xml: [code] [/code]3、定义一个实体类(带注解): @Document:把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的Collection名字。 @Id:文档的唯一标识,在mongodb中为ObjectId,它是唯一的 @Field:指定保存在mongoDB的名字,感觉类成员名字不好又不想改的时候可以用这个注解。 [code]import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @Document(collection ="user") public class User { @Id private String id; @Field("name") private String userName; //用户名称 @Field("age") private int userAge;//用户年龄 }[/code] 4、把实体类新增到mongoDB: [code]@Autowired private MongoTemplate mongoTemplateLogDB; public String insert(){ User user = new User(); user.setUserName("wanghuan"); user.setUserAge(1); System.out.println(user.toString()); System.out.println("begin insert"); try { mongoTemplateLogDB.insert(user); }catch (Exception e){ e.fillInStackTrace(); } System.out.println(user.toString()); System.out.println("insert successfully"); return "successfully"; }[/code] 5. 从mongoDB查询新增的的记录: [code]@Autowired private MongoTemplate mongoTemplateLogDB; public String query(){ System.out.println("begin query"); Query query =new Query(); query.addCriteria(new Criteria().orOperator(Criteria.where("name").is("wanghuan"))); List list = mongoTemplateLogDB.find(query, User.class); for (User user: list) { System.out.println("query user :" + user.toString()); } System.out.println("query successfully, list size is " + list.size()); return "successfully"; }[/code] 6. 验证截图: 新增7条数据后,查询结果: 14324 第二种XML配置:(支持) config.properties: [code]db.host=*** db.port=8635 db.database=hello db.credentials=rwuser:Hello123!@admin[/code]xml: [code] [/code]验证截图: 新增8条数据后,查询结果OK: 14325 第三种XML配置:(不支持) config.properties: [code]db.host=*** db.port=8635 db.database=hello db.username=rwuser db.password=Hello123! db.authSource=admin [/code]xml: [code] [/code]验证截图: 在8条数据的基础上,再新增3条数据后,查询结果还是8条,没有添加成功 14326 查询时也报错了: 14327 错误原因分析: 14349 14348 MongoTemplate1.7 以上版本db-factory 中将 authentication-dbname, username, password参数都废弃了,我们MongoTemplate使用的是1.8.4.RELEASE 版本,所以不能再使用这种方式进行连接。应采用 前两种 XML配置的连接方式。
-
本帖最后由 Nosql_newbee 于 2018-4-21 21:52 编辑Mongodb中的“普通”集合是动态的,而且可以自动增长以容纳更多的数据。另一种集合叫做固定集合(capped collections),固定集合在按照**顺序读写场景下性能有很大的提高。固定集合类似一个循环队列,如果集合空间满了,最老的文档会被删除以释放空间。固定集合中的数据被顺序的写入磁盘上的固定空间,因此他们在蝶式磁盘上的写入速度非常快,尤其是集合拥有专用磁盘时。 固定集合的特点: · 按顺序**,固定集合的存储数据(磁盘存储)顺序与数据**顺序一致。 · 自动删除最老的数据,当集合空间不足时,系统会将新数据**到最老的数据的位置,覆盖最老的数据 · 默认有_id字段,并在该字段上创建索引 · 文档更新时,当更新或者替换的文档修改了原文档的大小,则更新会失败。 · 不能从固定集合中删除单个文档,如果要删除文档,只能删除集合中的所有文档 · 固定集合不支持分片 · 使用自然排序,去查找最近**的文档效率非常高 · 管道聚合命令$out不能写入固定集合 · TTL索引不能创建在固定集合中 1、固定集合的创建: db.createCollection("mytest":{"capped":true,"size":1000000}) 创建了一个大小为1000000字节的固定集合,除了大小,还能够指定集合中文档的数量: db.createCollection("mytest01":{"capped":true,"size":1000000,"max":100}); 该集合可以保存10个文档,或者存储大小为1000000的文档,两者取最小的,如果10个文档超过了大小限制则会覆盖老的文档。固定集合的文档数量不能超过文档的数量限制,也不能超过大小的限制。固定集合创建之后,就不能改变了,如果需要改变固定集合的属性,只能将集合删除重建。 创建固定集合时还有另一个选项,可以将已有的某个普通结合转换为固定集合,例如 db.runCommand({"convertToCapped":"test","size":10000}); 无法将固定集合转换为非固定集合。 2、固定集合查询: 查询固定集合时,如果不指定顺序,则返回结果的顺序与**顺序一致,如果需要查询结果与**顺序相反,使用sort方法 db.cappedCollection.find().sort( { $natural: -1 } ) 3、循环游标: 循环游标是一种特殊的游标,当循环游标的结果集被取光后,游标不会被关闭,类似于unix的tail -f命令,尽可能多的提取输出结果。由于循环游标在结果集取完之后不被关闭,当有新文档进入到集合中时,循环游标会继续取到结果。由于普通集合并不维护文档的**顺序,所以循环游标只能用在固定集合上。 如果超过10分钟没有新结果,循环游标就会被释放。
Nosql_newbee 发表于2018-04-21 20:11:49 2018-04-21 20:11:49 最后回复 Nosql_newbee 2018-04-21 20:11:49
6948 0 -
条件操作符是用来过滤查询结果的,Mongodb支持大量的条件操作符,比如常见的条件操作符有 $gt(大于),$lt(小于),$nin(不属于),$not(不符合),$mod(取模),$slice(切片),$exists(字段存在),$size (元素个数),$type(类型匹配)。 1. 比较操作符以下条件操作符可用于在查询中执行大小比较,过滤出字段符合要求的记录。$gt大于参数,该参数指定文档中的某个整数必须大于一个指定值时,才能在结果中返回,查询格式如下:[code]db.collection.find({ "field" : { $gt: value } } ); // 大于: field > value[/code] $lt 小于参数$gte 大于等于$lte 小于等于 2. $ne 不等于$ne 代表不等于的含义,表示获取文档中某个参数的值不符合指定值的所有文档 [code]db.collection.find({ "field" : { $ne: value } } ); [/code] 3. 包含类的操作符$in 相当于SQL中的in操作符,可以规定多个指定值作为筛选条件,查找出符合这组匹配值里任意一个值的所有文档。查询格式如下:[code]db.collection.find({ "field" : { $in: [value1, value2] } } ); [/code] $nin 与$in 类似,含义相反,表示搜索某字段的值不在指定数组列表中的所有文档。 $all 与 $in 也类似,不过它的含义时要匹配指定数组列表中的所有值。比如[code]db.collection.find({ "field" : { $all: [value1, value2] } } ); [/code] 要使field的值包含[value1,value2]两个值时才满足。 4. $exists 存在$exists 判断字段是否存在。如下,是筛选出存在该 field字段的所有文档。[code]db.collection.find({ "field" : { $exists: true } } ); [/code] 5. null Null值处理筛选出某个字段为null 或者 某个字段不存在的所有文档[code]db.collection.find({ "field" : null } ); [/code] 如果只想筛选出 字段为null值的,而且字段确实存在的文档时,使用下面的查询格式:[code]db.collection.find({ "field" : {"$in":[null ], "$exists":true} } ); [/code] 6. 取模运算$mod 用于筛选取模后符合要求的文档,如下查询表达式表示 筛选field字段取模 value1后值为value2的文档[code]db.collection.find({ "field" : { $mod: [value1, value2]} } );[/code] 7. $size 元素个数查询出参数符合指定元素个数的文档,查询格式如下,表示筛选 field字段的元素包含value个值的文档。 [code]db.collection.find({ "field" : { $size: value } } ); [/code] 8. $slice 切片有如下两个查询方式,第一种表示查询返回某一字段的值的前几项,第二种方式,第一个参数定义偏移,第二个参数用于定义限制,表示要返回的数据项的总数。[code]db.collection.find({ "field" : { $ slice: value } } ); db.collection.find({ "field" : { $ slice: [value1,value2]} } ); [/code] 9. $not 不符合某操作符可以使用$not元操作符否定任何标准操作符执行的检查。$not操作符只能作用与于其他操作符上,不能单独在字段和文档上使用。查询格式如下,表示筛选出 不符合 field字段大于value值的文档,包含fileld的值不存在的情况。[code]db.collection.find({ "field" : { $not: { $gt: value } } } ); [/code]10. $regex 正则表达式 可以通过正则表达式来进行过滤,查询格式如下,表示筛选出字段符合正则表达式要求的文档。[code]db.collection.find({ "field" : { $regex: value } } } ); [/code] 11. $type$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。筛选某个字段符合指定的BSON类型的文档。查询格式如下,value 值代表类型的索引值。比如如果value为2,表示筛选出field字段为String类型的文挡。 [code]db.collection.find({ "field" : { $type: value } } } ); [/code] BSON类型如下图:14024
-
本帖最后由 Mongo_奇 于 2018-4-16 22:23 编辑【MongoDB】MongoDB分片集群之Config Server MongoDB作为NOSQL数据库,相较于关系型数据库的一大优势就是可扩展性。MongoDB的扩展性正是通过分片集群(shard cluster)来保证的。 分片集群包含了三种角色:mongos,shard,config server,这里介绍 config server在分片集群中所起到的作用。 关于Config Server: 官方文档说明为:Config Servers store the metadata for a [color=rgb(0,108,188)]sharded cluster. The metadata reflects state and organization for all data and components within the sharded cluster. The metadata includes the list of chunks on every shard and the ranges that define the chunks. 即Config Server存储的是分片集群的元数据,元数据反映了分片集群中所有数据和组件的状态和分布。它记录了每个shard上存储的数据块(chunk)的列表,以及每个数据块存储的数据范围。也就是说只有Config Server才知道数据具体存在哪里。 因为Config Server存储的数据至关重要的,所以Config Server往往以副本集的形式部署以保障高可用。 Config Server中存储的数据: 数据库: config 常用集合: 1. config.changelog: :记录了被分片集合的元数据的更改。 2. config.chunks: 记录了集群中数据块(chunk)的分布。 [indent][code] { "_id" : "testdb.ball-a_\"baseball\"", "lastmod" : Timestamp(500, 3), "lastmodEpoch" : ObjectId("607p8407bd5as175c5cjk5fddc"), "ns" : "testdb.ball", "min" : { "ball" : "baseball" }, "max" : { "ball" : "football" }, "shard" : "shard02" }[/code] 3. config.collections: 记录了被集群中被分片的集合。 4. config.database: 记录了数据库是否启用分片,并且会显示主分片的shard名称。 [/indent][indent][code]{ "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "testdb", "partitioned" : true, "primary" : "shard02" }[/code] 5. config.mongs: 记录了集群的mongos节点信息,并且会显示mongos上一次ping的时间。 6. config.shards: 记录了shard节点的信息。 7. config.settings: 记录了chunk的大小,balancer状态, 是否启用chunk的自动分割(默认启用) [code]{ "_id" : "chunksize", "value" : 64 } { "_id" : "balancer", "stopped" : false } { "_id" : "autosplit", "enabled" : true }[/code] [/indent]
-
索引的作用:当一个集合数据量很大时,从这个集合中查找某条记录时,会从这个集合的第一条顺序查找起直到找到特定记录或者查找完整个集合,这个查找时间会很长,查询花费的时间几十秒到几分钟。而索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,当查找特定记录时就从这个特殊的易于遍历的数据结构中查找,查询花费的时间大大的缩短。 创建索引:MongoDB使用 createIndex () 方法来创建索引,具体命令:db.collection. createIndex ({key:1}),其中collection为要在集合上创建索引的集合名, Key 值为你要创建的索引字段,1为指定按升序创建索引,-1为指定按降序创建索引。 索引分类: 单字段索引: 只在一个字段上建立索引,db.collection. createIndex ({key:1}),这样就在集合collection上的字段key创建了升序的单字段索引。建立了单字段索引后,就能加速对key字段的查询速度。Mongodb对每个集合默认建立的_id字段就是一个单字段索引,也是唯一的主键。复合索引: db.collection.createIndex({key:1,key1:1})建立在两个字段key,key1上的复合索引,所谓复合索引就是针对多个字段联合创建的索引,先按第一个字段排序,第一个字段相同的文档按第二个字段排序,依次类推。复合索引不仅能满足多个字段组合起来的查询,也能满足所以能匹配符合索引前缀的查询。例如db.collection.createIndex({key:1,key1:1})不仅能在字段key,key1上加速查询,也能满足只查找key字段的加速查询。但如果只查找key1字段,则无法进行索引加速。如果经常在key1字段上查询,则应该建立db.collection. createIndex ({key1:1,key:1})的符合索引。除了查询的需求能够影响索引的顺序,字段的值分布也是一个重要的因素。如果 key字段的取值很有限,即拥有相同key字段的文档会有很多;而key1字段的取值则丰富很多,拥有相同key1字段的文档很少,则先按key1字段查找,再在相同key1的文档里查找key字段更为高效。hash索引:db.collection.createIndex({key: "hashed"})这样就在字段key上创建了hash索引,mongodb自动计算字段的hash值,无需用户计算,hash索引只能进行字段的完全匹配查询,不能进行范围查询。 索引的一些特殊属性:唯一索引:对于某些字段值,用户希望是唯一的不重复的,这时就可以设置索引的属性为唯一的。db.collection.createIndex({key: 1 },{ unique: true })在创建key字段为索引的时候加上属性字段unique建立的就是唯一单字段索引。db.collection.createIndex({key: 1, key1: 1 },{ unique: true })创建的就是唯一复合索引。TTL索引: 如果希望当某些记录超过一段时间后,自动从数据库里面被删除,那就可以在建立索引的时候带上TTL属性,但需要满足一个条件:建立TTL索引的那个字段必须是data类型的字段或者包含data类型的数组。db. collection.createIndex({"lastModifiedDate": 1 }, { expireAfterSeconds: 3600 }),其中lastModifiedDate字段的类型必须是data或包含data的数组,这样当lastModifiedDate字段的值距离当前时间值超过3600秒后就会被删除。 索引优化: 当一个建立索引的查询依然花费较长时间时,怎么看这个索引存在的问题呢?可以通过查询计划来决定如何优化。在查找语句后面加上.explain()例如: db.collection.find({key:18}).explain(),通过查询的执行计划可以看出索引上是否存在问题:查询的字段没有建立索引,建立了索引但执行查询时没有使用预期的索引。
上滑加载中
推荐直播
-
探秘仓颉编程语言:华为开发者空间的创新利器
2025/02/22 周六 15:00-16:30
华为云讲师团
本期直播将与您一起探秘颉编程语言上线华为开发者空间后,显著提升开发效率,在智能化开发支持、全场景跨平台适配能力、工具链与生态完备性、语言简洁与高性能特性等方面展现出的独特优势。直播看点: 1.java转仓颉的小工具 2.仓颉动画三方库lottie 3.开发者空间介绍及如何在空间用仓颉编程语言开发
回顾中 -
大模型Prompt工程深度实践
2025/02/24 周一 16:00-17:30
盖伦 华为云学堂技术讲师
如何让大模型精准理解开发需求并生成可靠输出?本期直播聚焦大模型Prompt工程核心技术:理解大模型推理基础原理,关键采样参数定义,提示词撰写关键策略及Prompt工程技巧分享。
去报名 -
华为云 x DeepSeek:AI驱动云上应用创新
2025/02/26 周三 16:00-18:00
华为云 AI专家大咖团
在 AI 技术飞速发展之际,DeepSeek 备受关注。它凭借哪些技术与理念脱颖而出?华为云与 DeepSeek 合作,将如何重塑产品与应用模式,助力企业数字化转型?在华为开发者空间,怎样高效部署 DeepSeek,搭建专属服务器?基于华为云平台,又该如何挖掘 DeepSeek 潜力,实现智能化升级?本期直播围绕DeepSeek在云上的应用案例,与DTSE布道师们一起探讨如何利用AI 驱动云上应用创新。
去报名
热门标签