MongoDB的基本内容和应用场景介绍

news2024/10/21 20:42:51

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 的常见应用场景

  1. 社交场景

    ​ 适合存储用户信息,比如用户的基本资料、账号信息、个人偏好等。用户的各种动态信息,如朋友圈、微博等也可以方便地以文档形式存储。

    ​ 通过地理位置索引可以实现附近的人、定位等功能,方便社交应用中的位置相关服务,例如基于位置的社交推荐、附近的活动推荐等。

    示例代码如下:

    # 连接到 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
            }
        }
    }
    
  2. 内容管理场景

    ​ 适合存储文章、新闻、博客等文本内容,以及评论、标签等相关信息。可以支持全文搜索功能,方便用户快速查找感兴趣的内容;支持分类和排序功能,便于内容的管理和展示。

    示例代码如下:

    # 连接到 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)
    
  3. 游戏场景

    ​ 可以存储游戏用户信息,如玩家的账号、等级、经验、装备、积分等。这些信息可以直接以内嵌文档的形式存储,方便查询和更新,能够快速响应用户在游戏中的各种操作。

    示例代码如下:

    # 连接到 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
    }
    
  4. 物流场景

    ​ 存储订单信息,订单状态在运送过程中会不断更新,以 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'}
        ]
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2219425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DNS 与 ICMP

DNS(Domain Name System)快速了解 DNS 是一整套从域名映射到 IP 的系统 DNS 背景 TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序. 但是 IP 地址不方便记忆 于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用 hosts 文件来描述主机 名和 IP 地…

【Hive】8-Hive性能优化及Hive3新特性

Hive性能优化及Hive3新特性 Hive表设计优化 Hive查询基本原理 Hive的设计思想是通过元数据解析描述将HDFS上的文件映射成表 基本的查询原理是当用户通过HQL语句对Hive中的表进行复杂数据处理和计算时&#xff0c;默认将其转换为分布式计算 MapReduce程序对HDFS中的数据进行…

基于排名的股票预测的关系时态图卷积网络(RT-GCN)

“ 为了充分利用股票之间的关系&#xff0c;获得最高收益&#xff0c;提出了一种关系时态图卷积网络(RT-GCN)。” 标题&#xff1a;Relational Temporal Graph Convolutional Networks for Ranking-Based Stock Prediction 链接&#xff1a;https://ieeexplore.ieee.org/do…

Android15之解决gdb:Remote register badly formatted问题(二百三十六)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

2024全国大数据与计算智能挑战赛火热报名中!

一年一度的 全国大数据与计算智能挑战赛震撼来袭&#xff01; 报名速通&#xff1a; https://www.datafountain.cn/special/BDSSF2024 大数据与决策&#xff08;国家级&#xff09;实验室连续三年组织发起全国大数据与计算智能挑战赛&#xff0c;旨在深入挖掘大数据应用实践中亟…

STM32传感器模块编程实践(九) VL53L0X激光红外测距传感器简介及驱动源码

文章目录 一.概要二.VL53L0X测距原理三.VL53L0X主要特性四.VL53L0X硬件参考设计五.模块接线说明六.模块通讯协议介绍七.光学盖玻片介绍八.STM32单片机与VL53L0模块实现距离测量实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 九.小结 一.概要 VL53L0X是一款由ST&#xff0…

通过PHP与API的结合,开启电商数据集成的新篇章

在数字化转型的浪潮中&#xff0c;电子商务数据的集成对于企业来说变得越来越重要。无论是在线零售商还是品牌商&#xff0c;都需要实时访问商品数据以优化库存管理、制定定价策略、提升客户体验。PHP&#xff0c;作为服务端脚本语言的佼佼者&#xff0c;为开发者提供了强大的工…

调查显示软件供应链攻击增加

OpenText 发布了《2024 年全球勒索软件调查》&#xff0c;强调了网络攻击的重要趋势&#xff0c;特别是在软件供应链中&#xff0c;以及生成式人工智能在网络钓鱼诈骗中的使用日益增多。 尽管各国政府努力加强网络安全措施&#xff0c;但调查显示&#xff0c;仍有相当一部分企…

【verilog】3_8-4_16数选器

文章目录 前言一、实验原理二、实验过程三、实验结果参考文献 前言 进行 实验 一、实验原理 二、实验过程 三、实验结果 代码 timescale 1ns/1ns module decoder_38_tb ; reg a; reg b; reg c; wire [7:0]data;decoder_38 u0 (.a(a),.b(b),.c(c),.data(data) ); init…

pandas-使用技巧

pandas-使用技巧 简单技巧 仅个人笔记使用&#xff0c;感谢点赞关注 简单技巧 pd.to_dict()&#xff1a;Dataframe格式数据转字典数据pd.dropna()&#xff1a;去nan值& | ~&#xff1a;pd逻辑运算符pd.isnan()&#xff1a;判断是否为nan值pd.concat&#xff1a;多个pd拼接…

关于武汉芯景科技有限公司的限流开关芯片XJ6241开发指南(兼容LTC4411)

一、芯片引脚介绍 1.芯片引脚 二、系统结构图 三、功能描述 1.CTL引脚控制VIN和VOUT的通断 2.CTL引脚控制STAT引脚的状态 3.输出电压高于输入电压加上–VRTO的值&#xff0c;芯片处于关断状态

揭秘Map与Set的键值奥秘与集合魅力,解锁高效数据魔法

文章目录 前言➰一、关联式容器1.1 关联式容器的概述1.2 关联式容器的工作原理1.3 关联式容器的核心特性 ➰二、键值对2.1 键值对的基本概念2.2 键值对在C中的实现 ➰三、树形结构的关联式容器3.1 树形结构的特点3.2 使用场景 ➰四、set的使用与定义4.1 set的基本特性4.2 set的…

OpenCV高级图形用户界面(11)检查是否有键盘事件发生而不阻塞当前线程函数pollKey()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 轮询已按下的键。 函数 pollKey 无等待地轮询键盘事件。它返回已按下的键的代码或如果没有键自上次调用以来被按下则返回 -1。若要等待按键被按…

软件压力测试如何进行?深圳软件测试机构分享

软件压力测试是每个重要软件测试工作的一部分&#xff0c;是一种基本的软件质量保证行为。压力测试不是在常规条件下运行手动或自动测试&#xff0c;而是在计算机数量较少或系统资源匮乏的条件下运行测试。通常要进行软件压力测试的资源包括内部内存、CPU 可用性、磁盘空间和网…

算法day-1

数组&#xfeff; 数组是存放在连续内存空间上的相同类型数据的集合。数组的下标或者索引是从0开始的. 数组的优点 快速访问&#xff1a;通过索引可以在常数时间内&#xff08;O(1)&#xff09;访问数组中的任意元素。顺序存储&#xff1a;数组中的元素在内存中是连续的&…

Codeforces 979 Div2 A-D (D. QED‘s Favorite Permutation详解)

比较开心能做出D A 原题 A. A Gift From Orangutan 思路 找到最大值最小值差值乘n - 1 即可 代码 #include <bits/stdc.h> #define int long long#define F(i, a, b) for (int i (a); i < (b); i) #define dF(i, a, b) for (int i (a); i > (b); i--)using…

C#学习笔记(一)

C#学习笔记&#xff08;一&#xff09; 简介第一章 上位机开发环境之 VS 使用和.NET 平台基础一、安装软件二、创建项目三、第一个Hello world四、解决方案与项目五、Debug 和 Release 的区别六、代码的生产过程七、CLR的其它功能 简介 C# .NET工控上位机开发 在工控领域&…

Nuxt.js 应用中的 build:before 事件钩子详解

title: Nuxt.js 应用中的 build:before 事件钩子详解 date: 2024/10/20 updated: 2024/10/20 author: cmdragon excerpt: build:before 钩子在 Nuxt.js 中是一种有力的工具,使开发者能够在应用的构建流程开始之前进行自定义处理和配置。在处理动态需求和配置时,开发者可以…

深度解析RLS(Recursive Least Squares)算法

目录 一、引言二、RLS算法的基本思想三、RLS算法的数学推导四、RLS算法的特点五、RLS算法的应用场景六、RLS算法的局限性七、总结 一、引言 在自适应滤波领域&#xff0c;LMS&#xff08;Least Mean Squares&#xff09;算法因其计算简单、实现方便而广受欢迎。然而&#xff0…

C++ 哈希桶和封装unordered_map和unordered_set

目录 哈希桶的概念 哈希桶的结构 哈希桶的结点 哈希桶的类 Insert插入函数 Find查找函数 Erase删除函数 哈希的两种仿函数(int) 和(string) 哈希表的改造 ​编辑 迭代器 改造 unordered_map和unordered_set的封装 前言 上一篇文章讲的哈希表&#xff0c;属于闭散…