MongoDB是一项通用工具,但它也并非完美。针对某些MongoDB不适用的场合,有时可选用设计模式来加以应对。
MongoDB是一个NoSQL文档数据库,在大多数情况下是一个相对理想的选择,即使是在其不适用的情况下,也仍然可以依靠下面所列举的这些设计模式来克服其局限性。
本文将针对我的另一篇文章《MongoDB的好坏恶》( MongoDB : The Good, The Bad, and the Ugly)中所提及的一些局限性,提供一个相对应的解决方案。
1. 查询命令分离模式
在副本集中职责被分离到不同的节点。最基本的第一类节点可能也同时占据着首要地位,它只需要储存那些写入和更新所需的数据。而查询工作则交由第二类节点来执行。这一模式将提升首要节点服务器的写吞吐量,因为当写入一组对象时,需要更新及插入的数据量也随之减少,除此之外,二类节点也得益于较少的待更新数据和其自身所具有的为其工作量而优化的内存工作集。
2. 应用程序级事务模式
MongoDB不支持事务和文件内部锁定。然而,依据应用逻辑,应当保留queue用法。
- db.queue.insert( { _id : 123,
- message : { },
- locked : false,
- tlocked : ISODate(),
- try : 0 });
- var timerange = date.Now() - TIMECONSTANT;
- var doc = db.queue.findAndModify( { $or : [ { locked : false }, { locked : true, tlocked : {
- $lt : timerange } } ], { $set : { locked : true, tlocked : date.Now(), $inc : { try : 1 } } }
- );
- //do some processing
- db.queue.update( { _id : 123, try : doc.try }, { } );
3. Bucketing模式
当文本含有一个不断增长的数组时,则使用Bucketing模式,例如指令。而指令线可能会扩展到超过文档大小的合理值。该模式经由编程方式处理,并通过公差计算触发。
- var TOLERANCE = 100;
- for( recipient in msg.to) {
- db.inbox.update( {
- owner: msg.to[recipient], count: { $lt : TOLERANCE }, time : { $lt : Date.now() } },
- { $setOnInsert : { owner: msg.to[recipient], time : Date.now() },
- { $push: { "messages": msg }, $inc : { count : 1 } },
- { upsert: true } );
4. 关系模式
有时,会有不能插入整个文档的情况,例如人体建模时,我们就可以使用该模式来建立关系。
- 确定数据是否属于该文档,即二者间是否有关系。
- 如果可能的话,特别是面对有用的独有(专属)数据时,插入文档。
- 尽可能不参考id值。
- 对关系中的有用部分进行反规范化处理。好的候选不会经常甚至从不更改值,并且颇为有用。
- 关注反规范数据的更新和关系修复。
- {
- _id : 1,
- name : ‘Sam Smith’,
- bio : ‘Sam Smith is a nice guy’,
- best_friend : { id : 2, name : ‘Mary Reynolds’ },
- hobbies : [ { id : 100, n :’Computers’ }, { id : 101, n : ‘Music’ } ]
- }
- {
- _id : 2,
- name : ‘Mary Reynolds’
- bio : ‘Mary has composed documents in MongoDB’,
- best_friend : { id : 1, name : ‘Sam Smith’ },
- hobbies : [ { id : 101, n : ‘Music’ } ]
- }
5. 物化路径模式
在一个数据模型的树模式中,同一对象类型是该对象的子对象,这种情况下可以使用物化路径模型来以获取更高效的检索、查询。示例如下:
- { _id: "Books", path: null }
- { _id: "Programming", path: ",Books," }
- { _id: "Databases", path: ",Books,Programming," }
- { _id: "Languages", path: ",Books,Programming," }
- { _id: "MongoDB", path: ",Books,Programming,Databases," }
- { _id: "dbm", path: ",Books,Programming,Databases," }
按字段路径查询树模式:
- db.collection.find().sort( { path: 1 } )
使用路径字段的常规表达来找出Programming的后代集:
- db.collection.find( { path: /,Programming,/ } )
在Books是top parent的情况下查询Books的后代集:
- db.collection.find( { path: /^,Books,/ } )
相关推荐
《MongoDB应用设计模式:MongoDB Applied Design Patterns》这本书深入探讨了在实际开发中如何有效地利用MongoDB的优势来构建高效、可靠且易于维护的数据存储解决方案。 在设计模式方面,书中可能涵盖了以下关键...
通过对上述几种MongoDB设计模式的学习,我们可以了解到在不同的业务场景下,如何合理地设计数据结构以提高应用程序的性能和可维护性。在实际项目中,还需要根据具体需求选择合适的设计模式,并结合MongoDB提供的各种...
在移动安全领域,MongoDB常被用于存储和处理大量的敏感用户数据,因此,确保其高级设计模式和安全策略是至关重要的。本篇文章将深入探讨“数据即服务”在MongoDB中的实现,以及如何在这一框架下确保移动应用的安全性...
《MongoDB Applied Design Patterns》是一本专为MongoDB设计模式应用而编写的经典教程,适合对数据库技术感兴趣的初学者及有经验的开发者。MongoDB是一款流行的NoSQL数据库系统,以其高性能、灵活性和易于扩展性而受...
MongoDB是一种流行的开源、分布式文档型数据库,以其灵活性、高性能和可扩展性而备受开发者青睐。作为NoSQL数据库的一种,MongoDB不采用传统...在实际应用中,合理的设计和优化策略对于充分利用MongoDB的优势至关重要。
在性能优化方面,手册会讲解索引的创建与管理,以及如何根据查询模式设计有效的索引策略。MongoDB支持单字段索引、复合索引、文本索引等多种类型的索引,它们对查询速度有着显著影响。另外,手册还会涉及数据复制集...
通过这些知识点,我们可以看出MongoDB的架构设计不仅注重了灵活性、速度和多样性,而且提供了从传统数据库到现代云服务环境的无缝迁移路径。这些特性共同促进了MongoDB在企业级解决方案中不断增长的普及度。
面对设备网络问题导致的数据乱序,MongoDB 结合适当的数据模型和应用端策略,例如使用分桶模式,可以有效地整理和处理乱序数据。 在实际案例中,例如一个包含电灯、门禁、插座等设备的 IoT 系统,规划设备数量达到...
12. **应用程序设计**:指导如何设计适合 MongoDB 的应用程序架构,包括数据建模的最佳实践和分片策略。 通过深入阅读并理解"复件 MongoDB Manual",无论是开发人员还是数据库管理员,都能掌握 MongoDB 的核心功能...
- 主从模式、仲裁节点的角色及作用。 - 故障转移机制及其实现方法。 **第7讲:分片集群** - 分片集群的架构原理。 - 配置分片集群的步骤。 - 负载均衡和数据分布策略。 #### 第二部分:MongoDB高级实战开发 **第8...
在设计 MongoDB 文档模式时,应优先考虑内嵌,尽可能地遵循对象模型。对于一对一、一对多关系,可以直接在一个文档内表示。当数据量过大超出单个文档限制时,可以使用引用策略。然而,引用可能导致性能下降和事务性...
同时,理解并掌握MongoDB的最佳实践,如数据模型设计、索引策略、运维监控等,对于充分利用MongoDB的优势至关重要。 MongoDB的广泛应用包括Web应用、物联网、数据分析、日志处理等多个领域,尤其适合需要高吞吐量、...
13. **最佳实践**:了解如何设计数据库模式、优化查询性能以及调整配置参数,以获得最佳的MongoDB运行效果。 通过阅读这个实战指南,读者不仅能掌握MongoDB的基本操作,还能深入理解其高级特性和实际应用场景,从而...
文档提供了丰富的数据模型示例,展示了如何针对不同的应用场景选择合适的数据模型,并给出了一些实用的设计模式。 **4.5 数据模型参考** 这部分内容提供了关于数据建模的详细参考,包括如何定义和应用 JSON Schema...
9. **更新与结构化数据**:涉及数据模型设计原则,指导如何有效组织数据,同时介绍MongoDB的更新操作。 10. **性能优化**:提供了性能调优技巧,如缓存策略、查询优化等,确保数据库的高效运行。 11. **MongoDB...
通过上述案例和策略的介绍,我们可以看到,MongoDB性能扩展是一个多方面的过程,涉及数据模型设计、索引选择、内存和I/O优化等多个方面。只有综合考虑这些因素,并根据具体的业务场景进行灵活调整,才能最大限度地...
综上所述,"spring boot整合mongodb"涉及到的主要知识点包括Spring Boot与MongoDB的集成方式、配置、数据操作接口、Repository模式、Document对象设计、版本兼容性策略以及相关的安全性和监控措施。通过这个压缩包...
这部分内容讨论了MongoDB的数据模型特点,从关系型数据模型转向文档型数据模型的优势,例如嵌入式文档带来的性能提升、动态模式以及水平扩展的便利性。文档中提到了在关系型数据库中工作良好的特性如索引,在MongoDB...
再者,MongoDB采用C++作为主要的开发语言,因此源代码对于学习C++编程,特别是大型项目管理、设计模式和并发控制等方面有着很高的参考价值。在源码中,你可以看到如何利用C++11及更高版本的新特性来提高代码效率和可...
在迁移过程中,架构和数据模式设计的组织至关重要。应用程序集成到MongoDB的策略将影响迁移的复杂程度,以及在MongoDB中维护数据完整性和业务逻辑的能力。需要特别关注MongoDB独特的文档数据模型,以及它如何与传统...