MongoDB的基本内容和应用场景介绍
MongoDB 设计初衷——关系型数据库难以为继
MongoDB 始于 2007 年,由 Dwight Merriman、Eliot Horowitz 和 Kevin Ryan(曾是 DoubleClick 的主理团队)共同创立。DoubleClick 是一家互联网广告公司(现隶属于 Google),该公司每秒提供 40 万个广告,但在可伸缩性和敏捷性方面经常遇到困难,团队不得不经常使用许多自定义数据存储来解决现有关系型数据库的不足。因此,他们决定开发一款新的数据库产品,以解决在 DoubleClick 时遇到的问题。
2009 年,经过将近 2 年的开发,10gen(最初的开发公司)开发出了 MongoDB 的雏形并将其开源以及正式命名为 MongoDB,同时成立开源社区,通过社区运营 MongoDB。MongoDB 的命名源于英文单词 “humongous”,意为 “巨大的”,这也体现了其设计之初的目标是能够处理大规模的数据。
MongoDB 支持的数据类型
基本数据类型
字符串(String):用于存储文本信息,如姓名、地址等。
整数(Integer):32 位或 64 位整数,可用于表示数量,如年龄、数量等。
浮点数(Double):用于表示带有小数部分的数值,如价格等。
布尔值(Boolean):表示真(true)或假(false),可用于表示状态,如是否激活等。
日期(Date):用于存储日期和时间信息。
复合数据类型
数组(Array):可以存储多个值,这些值可以是相同或不同的数据类型。
对象(Object):即嵌套文档,用于表示更复杂的结构关系。
ObjectId:是 MongoDB 中每个文档默认的唯一标识符,由 12 个字节组成,包含时间戳、机器标识符、进程标识符和随机数等信息。
MongoDB 的组成单元
文档(Document)
文档是 MongoDB 中的基本数据单元,类似于关系型数据库中的行。它是一个键-值对(key-value)的集合,采用类似 JSON(JavaScript Object Notation)的格式,不过在 MongoDB 中称为 BSON(Binary JSON)。例如:
{"name": "John Doe","age": 30,"address": {"street": "123 Main St","city": "Anytown","zip": "12345"},"hobbies": ["reading", "swimming"]}
集合(Collection)
集合是一组文档的容器,类似于关系型数据库中的表。集合没有固定的模式(schema - free),这意味着一个集合中的文档可以有不同的结构。例如,一个名为 “customers” 的集合可以包含以下不同结构的文档:
// 文档1{"customer_id": 1,"name": "Alice","phone": "123 - 456 - 7890"}// 文档2{"customer_id": 2,"company": "ABC Corp","contacts": [{"name": "Bob","email": "bob@abc.com"},{"name": "Carol","email": "carol@abc.com"}]}
数据库(Database)
数据库是集合的容器,一个 MongoDB 实例可以包含多个数据库。每个数据库可以有自己独立的权限设置、存储配额等管理功能。例如,可以有一个名为 “ecommerce” 的数据库,其中包含 “customers”、“products”、“orders” 等集合。
数据库名称不能是空字符串,且不能包含以下字符:/. " * < > : |? $。数据库名称最多为 64 个字节。
MongoDB 的常见应用场景
-
社交场景
适合存储用户信息,比如用户的基本资料、账号信息、个人偏好等。用户的各种动态信息,如朋友圈、微博等也可以方便地以文档形式存储。
通过地理位置索引可以实现附近的人、定位等功能,方便社交应用中的位置相关服务,例如基于位置的社交推荐、附近的活动推荐等。
示例代码如下:
# 连接到 MongoDB client = MongoClient('localhost', 27017) db = client['social_app_db'] users_collection = db['users'] posts_collection = db['posts']# 用户信息数据结构 user_info = {'username': 'johndoe','email': 'johndoe@example.com','personal_preferences': {'interests': ['music', 'sports']} }# 动态信息数据结构 post = {'user_id': user_info['_id'],'content': 'Having a great day!','likes': 0 }# 查询附近的人(假设已经有地理位置信息存储在用户文档中) nearby_users_query = {'location': {'$near': {'$geometry': {'type': 'Point','coordinates': [longitude, latitude]},'$maxDistance': radius_in_meters}} }
-
内容管理场景
适合存储文章、新闻、博客等文本内容,以及评论、标签等相关信息。可以支持全文搜索功能,方便用户快速查找感兴趣的内容;支持分类和排序功能,便于内容的管理和展示。
示例代码如下:
# 连接到 MongoDB client = MongoClient('localhost', 27017) db = client['content_management_db'] articles_collection = db['articles']# 文章信息数据结构 article = {'title': 'Interesting News','content': 'This is an interesting article...','tags': ['news', 'current affairs'],'comments': [{'user': 'user1', 'text': 'Great article!'},{'user': 'user2', 'text': 'Agreed!'}] }# 全文搜索查询 query = 'interesting' full_text_search_query = {'$text': {'$search': query}}# 分类和排序查询 category = 'news' sorted_results_query = {'tags': category}.sort('created_date', -1)
-
游戏场景
可以存储游戏用户信息,如玩家的账号、等级、经验、装备、积分等。这些信息可以直接以内嵌文档的形式存储,方便查询和更新,能够快速响应用户在游戏中的各种操作。
示例代码如下:
# 连接到 MongoDB client = MongoClient('localhost', 27017) db = client['game_db'] players_collection = db['players']# 游戏用户信息数据结构 player_info = {'player_id': 123,'username': 'gamer1','level': 10,'experience': 5000,'equipment': ['sword', 'shield'],'points': 1000 }
-
物流场景
存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,可以一次查询就能将订单所有的变更读取出来,方便物流企业对订单的跟踪和管理。
示例代码如下:# 连接到 MongoDB client = MongoClient('localhost', 27017) db = client['logistics_db'] orders_collection = db['orders']# 订单信息数据结构 order = {'order_id': 456,'status_history': [{'status': 'placed', 'timestamp': '2024-10-13T10:00:00Z'},{'status': 'shipped', 'timestamp': '2024-10-14T12:00:00Z'}] }