首页 > 数据库 >MongoDB 入门操作(Introduction to MongoDB Operations)

MongoDB 入门操作(Introduction to MongoDB Operations)

时间:2024-12-31 18:59:27浏览次数:3  
标签:Operations Introduction MongoDB 数据库 db 查询 文档 集合

「MongoDB 基础篇」入门操作

MongoDB 入门操作

目录

MongoDB 是非关系型文档数据库

的典型代表,非常适合写入大批量、高并发以及不规则的数据,因此广泛应用于爬虫

开发的存储后端。

✍ 当业务需求对联表查询不是很强烈,相反需要存储大量关联性不是很强的数据时,可以考虑使用 MongoDB 文档型数据库。

在 MongoDB 中,数据以“库、集合、文档、字段”的形式完成存储,乍一看和传统关系型数据库

的“库、表、行、列”的结构非常相似。

但 MongoDB 无需事先定义表结构,在需求不确定,变化多的大背景下,MongoDB 可以方便我们随时调整数据的字段。此外,MongoDB 并发写入的速度也远远超过传统的关系型数据库。

本篇文章,我们就来学习 MongoDB 中最基本的增、删、改、查操作,快速入门 MongoDB 数据库~

简介

MongoDB‌是一个基于分布式文件存储的开源数据库,由C++语言编写。它旨在为WEB应用提供可扩展的高性能数据存储解决方案,属于非关系型数据库(NoSQL)的一种,特别类似于关系型数据库。MongoDB支持的数据结构非常灵活,采用类似于JSON的BSON格式,可以存储复杂的数据类型,如文档、数组和嵌套文档‌。

主要特点

  1. 高性能‌:MongoDB提供高效的读写性能,特别适合实时数据的插入、更新和查询‌。
  2. 易部署和易使用‌:MongoDB的安装和使用相对简单,适合快速部署和开发‌。
  3. 灵活的数据模型‌:MongoDB采用无模式的设计,允许存储不同结构的文档,无需预先定义固定的模式,非常适合快速变化的应用场景‌。
  4. 高可扩展性‌:通过分片机制,MongoDB可以水平扩展,处理大规模数据和高并发访问‌。
  5. 丰富的查询语言‌:支持类似SQL的查询语言,可以进行复杂的查询操作,包括条件查询、排序和聚合等‌。
  6. 高可用性‌:通过副本集和分片技术,MongoDB可以实现数据冗余和故障转移,确保数据的持续可用‌。

应用场景

  1. 网站数据‌:MongoDB非常适合实时的插入、更新与查询,适用于需要高度伸缩性的网站数据存储‌。
  2. 高伸缩性场景‌:适合由数十或数百台服务器组成的数据库系统‌。
  3. 低价值数据‌:对于一些传统数据库存储成本较高的数据,MongoDB可以作为更经济的选择‌。
  4. 缓存‌:由于其高性能,MongoDB也适合作为信息基础设施的缓存层‌  
  5. 一. 数据库与集合操作
  6. 如果你使用 Navicat 连接 MongoDB 数据库,可以通过右键弹出的菜单新建数据库与集合。

说明了如何使用 Navicat 创建 Mongodb 数据库与集合,需要注意的是在创建集合时,点击左上角的『保存』按钮时,才会弹出集合命名的窗口。

接下来,我们通过 MongoDB 自带的 mongosh 命令行终端创建数据库与集合。

使用 mongosh admin 可以直接打开一个 Mongo Shell 并切换到 admin 数据库,否则需要使用 use admin 切换。

如果你的 MongoDB 设置了用户名和密码,需要使用 db.auth 先完成登录认证,并需要确保登录的用户具有相应操作的权限。

最后,使用 show dbs 命令可以看到我们刚刚通过 Navicat 创建的数据库 db1 。下面,我们切换到数据库 db1 ,查看集合列表,即可看到通过 Navicat 创建的集合 example_1

下面,我们使用 db.dropDatabase() 删除当前数据库 db1

我们发现虽然命令行提示符

还是 db1 ,但实际上数据库已经删除。为了有所区分,接下来我们创建一个名为 db_1 的数据库。

我们发现 db.create 的命令中并没有一个叫做创建数据库的函数,其实这一点很好理解,db 指代的就是当前数据,在当前数据库创建数据库显然逻辑上是不同的。

在 MongoDB 中,创建数据库其实就是 use 一个不存在的新库,不过此时数据库并未真实创建,唯一的变化只是命令行提示符变为了 my_db>

接下来,我们需要使用 db.createCollection 创建集合,才会看到被创建的数据库 my_db ,使用 show collections 命令可以观察到我们创建的集合。

此外,db.createCollection 在调用时还可以传入第二个位置参数,以键值对的形式指定配置选项。

上述的 example_data_2 集合在创建时指定了 cappedtrue ,意为启用上限设置,当集合的文档达到上限时,将会覆盖之前的数据,参数 size 指出这个上限值为 1 GB。

最后,使用 db.集合名称.drop() 命令即可删除某个集合。

下面的表格总结了本部分用到的命令行和函数。

命令行作用
db.auth('username', 'passwd')用户登录认证。
show dbs返回数据库列表。
use <database>切换到指定数据库。
在创建新数据库时,切换到一个不存在的数据库。
db.dropDatabase()删除当前数据库。
show collections返回当前数据库的集合列表。
db.createCollection('collection_name')在当前数据库创建集合。
db.collection_name.drop()删除指定集合。

二. 文档操作

有关记录(文档)的增、删、改、查是所有数据库的基本功能,接下来我们一起来看看如何向集合中插入数据,以及数据的查询、修改以及删除。

2.1 插入文档

MongoDB 的集合并不需要像传统关系型数据库那样事先定义表结构,我们只需要将 JSON 字符串直接插入相应的集合即可。

db.example_data_1.insertOne({
    "name": "Alex",
    "age": 20,
    "city": "BeiJing"
})

运行结果:

当 JSON 字符串描述的数据被插入到集合后,会自动获得一个 _id 字段,读作 Object ID,用来唯一确定一个文档。

Object ID 为一个 12 字节的十六进制数,由四部分组成:

  1. 时间戳(前 4 个字节)
  2. 机器码(接下来 3 个字节)
  3. 进程 PID(接下来 2 个字节)
  4. 自增计数器
  1. (最后 3 个字节)

比如,666279339a65012180002365 前八个字符为 66627933 ,我们利用 Python 转换为十进制数还原为日期时间。

>> a = 0x66627933

>> a
1717729587

>> from datetime import datetime

>> datetime.fromtimestamp(1717729587)
datetime.datetime(2024, 6, 7, 11, 6, 27)

接下来,我们继续向集合 example_data_1 中插入一条文档,不过相比于之前的文档,包含了一个新的字段 job ,并且缺少字段 city

db.example_data_1.insertOne({
    "name": "Bob",
    "age": 30,
    "job": "programmer"
})

运行结果:

新的数据同样成功插入了集合,查询缺失的字段将获得 Null 值。 下面,我们继续插入一条数据,提供了所有的字段,但年龄的类型却和历史记录不同。

db.example_data_1.insertOne({
    "name": "Chandler",
    "age": '28',
    "city": "Shanghai",
    "job": "lawyer"
})

运行结果:

通过打开『类型颜色』标注不同类型的值,我们发现虽然最后一条文档的 age 字段为字符串类型,前两条则为数字类型,但同样可以成功插入。

虽然 MongoDB 允许同一个字段存在不同的数据类型,也可以随意增减字段。但在设计数据库时,我们还是应该尽量确保同一字段使用同一种类型的数据,并提前规划好文档包含的字段。

insertOne 相对的是 insertMany ,允许我们依次插入多条记录:

db.example_data_1.insertMany([
    {
        "name": "David",
        "age": 40,
        "city": "Chongqing",
        "job": "farmer"
    },
    {
        "name": "Ganler",
        "age": 33,
        "city": "Nanjing",
        "job": "worker"
    },
    {
        "name": "Monica",
        "age": 27,
        "city": "Hangzhou",
        "job": "teacher"
    },
    
])

运行结果:

2.2 查询文档

查询所有数据:

db.集合名称.find()

示例:查询 example_data_1 集合的所有数据。

查询指定记录:

db.集合名称.find(条件文档)

、比如,下面的语句返回集合中年龄等于 33 并且城市为 Nanjing 的记录。

db.example_data_1.find({
    'age': 33,
    'city': 'Nanjing'
})

✍ 查询文档包含多个字段时,表示这些字段需要同时满足。

查询结果:

如果我们需要的过滤条件不是等于,而是某个范围,比如查询年龄在 [20,30) 之间的记录应该如何写条件文档呢?

这时,我们需要把原来值的部分变成字典,字典的键为各个范围操作符,值为各个范围的边界值。

db.集合名称.find({字段1: {操作符1: 边界1, 操作符2: 边界2, ...}, 字段2: ...})

其中 MongoDB 提供的范围操作符总结如下:

操作符含义
$gt>
$gte>=
$lt<
$lte<=
$ne!=

下面的语句查询年龄在 [20,30) ,并且城市不在北京的记录:

db.example_data_1.find({
    'age': {
        '$gte': 20,
        '$lt': 30
    },
    'city': {
        '$ne': 'BeiJing'
    }
})

查询结果:

集合的 find 命令其实可以接收两个参数:

db.集合名称.find(用于过滤记录的文档, 用于限定返回字段的文档)

在字段限定文档中,使用的键为字段名,对应的值只有 01 两种情况:

  1. 如果值为 0 ,表示在全部字段中剔除值为 0 的字段,并返回剩余字段。
  2. 如果值为 1,表示仅返回值为 1 的字段。

✍ 注意不能混合使用 01 ,会导致 MongoDB 报错。

下面,我们来查询 example_data_1 中的所有记录,但仅返回 nameage 字段。

db.example_data_1.find({}, {
    'name': 1,
    'age': 1
})

查询结果:

在查询结果中,除了 nameage 字段外还有 Object ID 字段。这是因为 Object ID 字段并不受上述条件的约束,默认会包含在所有查询结果中。

如不需要返回 _id 字段,MongoDB 允许我们在字段限定文档中明确 _id 为 0 。

最后,我们来看几个经常用在 find 调用结果上的方法。

count 命令

当需计算取满足要求的记录一共有多少条时,我们可以直接在 find 命令之后调用 count 命令。

limit 命令

当需要限定 find 返回的记录条数时,可以在 find 命令的调用结果上继续调用 limit ,指定最多返回多少条记录,如果记录不足,则返回查询到的全部记录。

sort 命令

对查询结果进行排序使用 sort 命令,该命令使用文档指定排序依据的字段,以及是升序还是降序。

其中,字段值为 1 表示升序,字段值为 -1 则表示降序。

上述命令根据 age 字段升序排列,最后一行记录中的 28 其实为字符串 '28' ,所以和我们预期的顺序不同。这也是为什么我们要尽量确保 MongoDB 同一集合的同一个字段类型一致的原因,否则可能出现意想不到的错误。

2.3 修改文档

文档的更新操作分为 updateOneupdateMany ,他们的参数完全一致,唯一的区别为:

  1. updateOne 只更新第一条满足要求的数据
  2. updateMany 更新所有满足要求的数据

我们以 updateOne 为例,更新操作的语法如下:

db.集合名称.updateOne(
    用于过滤记录的文档,
    {"$set": {'字段1':'值1', '字段2': '值2', ...}}
)

下面,我们将 chandler 的年龄由字符串 28 改为数字 28 :

db.example_data_1.updateOne(
    {'name': 'Chandler'}, 
    {'$set': {'age': 28}}
)

接下来,我们来看一个 updateMany 的例子,将集合中未定义 city 字段或 job 字段的记录,将 city 统一修改为 Beijingjob 统一修改为 programmer

下面,我们将 find 修改为 updateMany ,并添加第二个参数:{'$set': {'city': 'Beijing', 'job': 'programmer'}}

db.example_data_1.updateMany(
    {'$or': [{'city': {'$exists': false}}, {'job': {'$exists': false}}]}, 
    {'$set': {'city': 'Beijing', 'job': 'programmer'}}
)

运行结果:相关的两条记录字段值都得到了更新。

2.4 删除文档

文档的删除命令也分为 deleteOnedeleteMany ,前者只删除第一条满足要求的数据,后者则删除所有满足要求的数据。

为了防止误删数据,通常的做法是先查询所要删除的数据,确保过滤条件无误后,再将查询得到的数据删除。下面,我们删除 city 字段等于北京的两条数据。

返回的文档中,acknowledged

true 表示数据删除成功,deletedCount 表示一共删除了 2 条数据。

三. 数据去重

去重操作用到的命令为 distinct ,语法格式如下,其中第二个参数可以省略。

db.集合名称.distinct('字段名', 用于过滤记录的文档)

为了演示查询结果去重,我们可以先运行 insertMany 语句插入一些年龄、城市或职业重复的记录。

db.example_data_1.insertMany([
    {
        "name": "Albert",
        "age": 40,
        "city": "Chongqing",
        "job": "farmer"
    },
    {
        "name": "Doris",
        "age": 33,
        "city": "Nanjing",
        "job": "worker"
    },
    {
        "name": "Tom",
        "age": 27,
        "city": "Hangzhou",
        "job": "teacher"
    },
    
])

未去重的查询结果

查询 city 字段去重后的结果:

distinct 属于集合方法,直接在集合对象上调用。返回的数据为一个数组,其中包含了去重以后的值。下面,我们为 distinct 指定第二个参数,对年龄在 [20, 30)job 字段去重。

以上就是本篇文章的全部内容啦~

标签:Operations,Introduction,MongoDB,数据库,db,查询,文档,集合
From: https://blog.csdn.net/J56793/article/details/142689848

相关文章

  • 宝塔面板 MongoDB 安装 启动失败,pid文件不存在
    问题描述宝塔面板安装MongoDB数据库时提示安装启动失败,pid文件不存在启动失败,pid文件不存在:/www/server/mongodb/log/configsvr.pid查找原因宝塔面板-软件商店进入MongoDB设置,查看日志提示{"t":{"$date":"2024-12-20T12:02:55.049+08:00"},"s":"E","c":&qu......
  • Mongodb安装步骤 (.msi安装方式)
    我之前发的Mongodb安装步骤,被人建议使用.msi安装方式所以重新发一版Mongodb安装步骤(.msi安装方式)一、首先下载安装程序下载链接  TryMongoDBCommunityEdition|MongoDB 选择.msi   二、安装1、双击.msi 2、next: 3、勾选接受,next: 4、complete......
  • mongodb常见报错
    mongodb常见报错目录mongodb常见报错MongoDB异常MongoCursorNotFoundException背景:问题分析:解决方案方案一:null方案二:方案三:方案四:MongoDB异常MongoCursorNotFoundException报错内容:om.mongodb.MongoCursorNotFoundException:Queryfailedwitherrorcode-5Causedby:......
  • centos7.9 安装mongodb4.4.8
    安装依赖,命令如下sudoyuminstalllibcurlopensslxz-libs下载压缩包,地址如下https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.8.tgz解压压缩包,解压存放路径,根据自己定义来,我这里放到/home目录下tar-zxvfmongodb-linux-x86_64-rhel70-4.4.8.tgz复制......
  • 数据同步工具: mysql表级全量同步 / mongodb全量+增量同步 / redis全量+增量同步
    目录数据同步工具方案说明MySql同步方案概述配置说明MongoDB同步方案概述配置说明Redis同步方案概述配置说明启动同步服务文件准备启动服务数据同步工具mysql表级全量同步/mongodb全量+增量同步/redis全量+增量同步源码地址:https://github.com/jiashuaizhang/sync-jobs......
  • mongodb配置zabbix监控
    mongodb配置zabbix监控目录mongodb配置zabbix监控说明一、添加mongodb模版二、配置宏三测试连接:注意事项通过脚本方式添加监控项1.修改运行zabbixagent脚本的用户2.添加如下用户自定义脚本3.添加如下用户自定义脚本附脚本:db_monitor.confjkalert.shjkcur_connect.shjkdelay.shjk......
  • CSC1001: Introduction to Computer Science
    CSC1001:IntroductiontoComputerScienceProgrammingMethodologyAssignment4Assignmentdescription:Thisassignmentwillbeworth10%ofthefinalgrade.Foreachquestion,writeyourcodeinthecorresponding.pyfile(i.e.,forquestion1,useq1.py).Once......
  • 安装MongoDB,环境配置
    官网下载地址:MongoDBShellDownload|MongoDB选择版本安装下载完成双击打开点击mongodb-windows-x86_64-8.0.0-signed选择安装地址检查安装地址安装成功二.配置MongoDB数据库环境1.找到安装好MongoDB的bin路径复制bin路径打开此电脑->打开高级系统设置->......
  • Introduction to gRPC
    IntroductiontogRPChttps://grpc.io/docs/what-is-grpc/introduction/ AnintroductiontogRPCandprotocolbuffers.ThispageintroducesyoutogRPCandprotocolbuffers.gRPCcanuseprotocolbuffersasbothitsInterfaceDefinitionLanguage(IDL)and......
  • 批量为每个mongodb 创建user 给与权限
     importpymongofrompymongo.errorsimportOperationFailure#连接到MongoDBclient=pymongo.MongoClient("mongodb://root:root@192.168.18.54:27017/")#获取所有数据库名称db_names=client.list_database_names()#要创建的用户信息username="mongosea"......