MongoDB从0到1:高效数据使用方法

news2024/11/16 16:51:36

        MongoDB,作为一种流行的NoSQL数据库。从基础的文档存储到复杂的聚合查询,从索引优化到数据安全都有其独特之处。文末附MongoDB常用命令大全。

目录

1. 引言

MongoDB简介

MongoDB的优势和应用场景

2. 基础篇

安装和配置MongoDB

MongoDB基本概念

使用MongoDB Shell

3. 数据库操作

创建和删除数据库

切换数据库

查看当前数据库状态

4. 集合操作

创建集合与设置选项

列出所有集合

删除集合

5. 文档操作

插入文档

查询文档

更新文档

删除文档

6. 高级查询

比较操作符

逻辑操作符

数组操作符

7. 索引管理

创建索引

管理和优化索引

8. 聚合与分析

聚合操作简介

聚合管道

9. 备份与恢复

备份数据的重要性

使用mongodump和mongorestore

10. 数据导入导出

使用mongoimport和mongoexport

11. 安全与权限管理

配置访问控制

用户和角色管理

MongoDB常用命令大全

查询操作


1. 引言

MongoDB简介

        MongoDB是一种面向文档的NoSQL数据库,由于其高性能、高可用性和易扩展性,它已经成为了大数据和实时Web应用的热门选择。与传统的表格型数据库不同,MongoDB使用文档(通常是JSON样式)来存储数据,这使得数据的存储更加灵活和直观。

MongoDB的优势和应用场景

        MongoDB的主要优势包括其模式自由的文档模型、强大的查询语言、高性能、高可用的复制特性以及水平扩展能力。它广泛应用于内容管理、移动和社交应用、实时分析等多个领域。

2. 基础篇

安装和配置MongoDB

        MongoDB的安装相对简单,可以从MongoDB官网下载对应操作系统的安装包进行安装。对于大多数开发者来说,推荐使用默认配置即可开始。在安装完成后,你可以通过启动mongod进程来运行MongoDB服务器。

MongoDB基本概念
  • 数据库(Database):数据库是存储集合的物理容器。一个MongoDB实例可以承载多个数据库。
  • 集合(Collection):集合类似于传统数据库中的表,是存储文档的地方。一个集合中的文档可以有不同的字段,但通常都是为了同一目的或主题而收集的。
  • 文档(Document):文档是MongoDB中数据的基本单位,类似于JSON对象,具有键值对的结构。
使用MongoDB Shell

        MongoDB Shell是一个交互式JavaScript接口,用于操作MongoDB。通过Shell,你可以执行查询、更新数据、管理数据库操作等。例如,使用show dbs命令可以列出所有数据库。

3. 数据库操作

创建和删除数据库

        要创建一个数据库,首先使用use <database_name>命令切换到该数据库。如果数据库不存在,MongoDB会在你第一次向其中写入数据时自动创建它。

        删除数据库使用db.dropDatabase()命令,在执行之前确保你在正确的数据库上下文中。

切换数据库

        使用use <database_name>命令可以切换当前的数据库上下文到指定的数据库。

查看当前数据库状态

   db.stats()命令可以显示当前数据库的状态信息,如数据大小、集合数量等。

4. 集合操作

        MongoDB中的集合类似于传统关系数据库中的表,但它不需要定义固定的表结构,这使得MongoDB非常灵活。

创建集合与设置选项

        创建集合可以使用db.createCollection(name, options)命令,其中name是你想要创建的集合名称,options是一个文档,用来指定集合的配置。例如,以下命令创建一个名为myCollection的集合,具有最大文档数限制和最大存储空间限制:

db.createCollection("myCollection", { capped : true, size : 5242880, max : 5000 } )

这里,capped表示创建一个固定大小的集合,size指定最大大小,max指定最大文档数量。

列出所有集合

        要查看数据库中所有的集合,可以使用show collections命令。这个命令会列出当前数据库中所有集合的名称。

删除集合

        如果你需要删除一个集合及其所有数据,可以使用db.<collection>.drop()命令。例如,要删除myCollection集合:

db.myCollection.drop()

5. 文档操作

文档是MongoDB中存储数据的基本单位,类似于JSON对象的结构。

插入文档
  • 插入单个文档:使用db.<collection>.insertOne(document)命令,如:

    db.myCollection.insertOne({ name: "John", age: 30, city: "New York" })
  • 插入多个文档:使用db.<collection>.insertMany([documents])命令,如:

    db.myCollection.insertMany([{ name: "Jane", age: 25, city: "Paris" }, { name: "Mike", age: 28, city: "London" }])
查询文档
  • 查找所有文档db.<collection>.find()会返回集合中的所有文档。

  • 条件查询:你可以传递一个查询文档来指定查询条件,例如查找所有年龄大于25的文档:

    db.myCollection.find({ age: { $gt: 25 } })
  • 限制返回字段:使用第二个参数来限制返回的字段,例如只返回namecity字段:

    db.myCollection.find({}, { name: 1, city: 1 })
更新文档
  • 更新单个文档db.<collection>.updateOne(filter, update, options)命令用于更新一个符合条件的文档。例如,更新第一个名字为"John"的文档:

    db.myCollection.updateOne({ name: "John" }, { $set: { age: 31 } })
  • 更新多个文档:使用db.<collection>.updateMany(filter, update, options)命令可以更新所有符合条件的文档。例如,将所有位于"New York"的文档的city字段更新为"Brooklyn":

    db.myCollection.updateMany({ city: "New York" }, { $set: { city: "Brooklyn" } })
删除文档
  • 删除单个文档db.<collection>.deleteOne(filter)命令删除第一个符合条件的文档。
  • 删除多个文档db.<collection>.deleteMany(filter)命令删除所有符合条件的文档。

6. 高级查询

        MongoDB提供了强大的查询能力,可以使用各种操作符来执行复杂的查询,包括比较、逻辑、数组等操作符。

比较操作符

        比较操作符允许进行数值比较,常用的包括$gt (大于)、$lt (小于)、$gte (大于等于)、$lte (小于等于) 等。例如,查询年龄在25到30岁之间的文档:

db.myCollection.find({ age: { $gte: 25, $lte: 30 } })
逻辑操作符

        逻辑操作符用于组合多个查询条件,常见的逻辑操作符有$and$or$not$nor。例如,查询年龄大于30或住在"New York"的文档:

db.myCollection.find({ $or: [{ age: { $gt: 30 } }, { city: "New York" }] })
数组操作符

        数组操作符可以查询数组类型的字段,如$in$all等。例如,查询拥有"reading"和"traveling"爱好的文档:

db.myCollection.find({ hobbies: { $all: ["reading", "traveling"] } })

7. 索引管理

索引对于提高MongoDB的查询性能至关重要。正确使用索引可以大幅度提高数据检索的速度。

创建索引

        使用db.<collection>.createIndex(keys, options)命令创建索引,其中keys指定了索引字段和索引类型(如升序1或降序-1),options可以指定索引的额外属性。例如,为myCollectioncity字段创建一个升序索引:

db.myCollection.createIndex({ city: 1 })
管理和优化索引

        你可以使用db.<collection>.getIndexes()查看集合的所有索引,使用db.<collection>.dropIndex(index)删除无用或过时的索引。正确管理索引对维护查询性能和存储效率非常重要。

8. 聚合与分析

        聚合操作允许对数据集进行复杂的转换和计算,MongoDB的聚合框架提供了强大的数据处理能力。

聚合操作简介

        聚合操作通常涉及多个阶段,每个阶段对数据进行转换,如过滤、分组、排序等。使用db.<collection>.aggregate([pipeline])进行聚合查询,其中pipeline是一个包含各个阶段的数组。

聚合管道

        聚合管道的常见操作包括$match(过滤文档)、$group(按某些字段分组)、$sort(排序)、$limit(限制结果数量)等。例如,下面的聚合查询按城市分组,计算每个城市的平均年龄:

db.myCollection.aggregate([ { $group: { _id: "$city", averageAge: { $avg: "$age" } } }, { $sort: { averageAge: -1 } } ])

9. 备份与恢复

在数据库管理中,定期备份数据是非常重要的,以确保数据的安全和可恢复性。

备份数据的重要性

定期备份可以保护数据免受硬件故障、数据损坏、操作错误等风险的影响。

使用mongodump和mongorestore
  • mongodump:这是MongoDB提供的一个备份工具,可以导出所有数据库数据到BSON文件中。使用方法如下:

    mongodump --db <database_name> --out <backup_directory>

    这会将指定数据库的备份保存在指定的目录中。

  • mongorestore:与mongodump相对应,这个工具用于恢复由mongodump导出的数据。使用方法如下:

    mongorestore --db <database_name> <backup_directory>

    这会从指定目录中的备份文件恢复数据库。

10. 数据导入导出

MongoDB提供了工具来帮助用户导入和导出数据,这对于数据迁移和备份非常有用。

使用mongoimport和mongoexport
  • mongoimport:这个工具用于将JSON、CSV或TSV格式的数据导入到MongoDB集合中。例如,导入JSON文件到指定集合:

    mongoimport --db <database_name> --collection <collection_name> --file <file_name>.json
  • mongoexport:与mongoimport相对应,这个工具用于将数据从MongoDB集合导出到JSON或CSV格式的文件中。例如,导出集合数据到JSON文件:

mongoexport --db <database_name> --collection <collection_name> --out <output_file_name>.json

11. 安全与权限管理

        在公开或敏感的应用环境中,确保数据库的安全是非常重要的。

配置访问控制

        启用访问控制来限制对MongoDB数据的访问。通过创建用户账号和角色,为每个用户分配适当的权限。

用户和角色管理
  • 创建用户:可以使用db.createUser()命令创建新用户,并为其指定角色。例如:

db.createUser({
  user: "myUser",
  pwd: "myPassword",
  roles: [ { role: "readWrite", db: "myDatabase" } ]
})

MongoDB常用命令大全

# 显示所有数据库
show dbs

# 切换到指定数据库(不存在则创建)
use <database_name>

# 显示当前数据库中的所有集合
show collections

# 删除当前数据库
db.dropDatabase()

# 创建集合
db.createCollection("<collection_name>", options)

# 删除集合
db.<collection_name>.drop()

# 插入单个文档
db.<collection_name>.insertOne({<document>})

# 插入多个文档
db.<collection_name>.insertMany([{<document1>}, {<document2>}, ...])

# 查询所有文档
db.<collection_name>.find()

# 查询符合条件的文档
db.<collection_name>.find({<query>})

# 更新符合条件的第一个文档
db.<collection_name>.updateOne({<query>}, {$set: {<update>}})

# 更新所有符合条件的文档
db.<collection_name>.updateMany({<query>}, {$set: {<update>}})

# 替换一个文档
db.<collection_name>.replaceOne({<query>}, {<newDocument>})

# 删除符合条件的第一个文档
db.<collection_name>.deleteOne({<query>})

# 删除所有符合条件的文档
db.<collection_name>.deleteMany({<query>})

# 创建索引
db.<collection_name>.createIndex({<field>: <direction>})

# 列出所有索引
db.<collection_name>.getIndexes()

# 删除索引
db.<collection_name>.dropIndex("<index_name>")

# 执行聚合管道
db.<collection_name>.aggregate([{<stage1>}, {<stage2>}, ...])

# 备份数据库
mongodump --db <database_name> --out <destination_directory>

# 恢复数据库
mongorestore --db <database_name> <path_to_backup>

# 导入数据
mongoimport --db <database_name> --collection <collection_name> --file <input_file>

# 导出数据
mongoexport --db <database_name> --collection <collection_name> --out <output_file>

# 创建用户
db.createUser({user: "<username>", pwd: "<password>", roles: [{role: "<role>", db: "<database_name>"}]})

# 删除用户
db.dropUser("<username>")

# 更新用户权限
db.updateUser("<username>", {roles: [{role: "<new_role>", db: "<database_name>"}]})

# 查看服务器状态
db.serverStatus()

# 查看当前操作
db.currentOp()

# 杀掉指定操作
db.killOp(<opid>)

# 数据库修复和压缩
db.repairDatabase()

# 查看集合的统计信息
db.<collection_name>.stats()

# 重命名集合
db.<collection_name>.renameCollection("<new_collection_name>")

# 限制查询结果数量
db.<collection_name>.find().limit(<number>)

# 跳过指定数量的文档
db.<collection_name>.find().skip(<number>)

# 对查询结果排序
db.<collection_name>.find().sort({<field>: <direction>})
查询操作
// 查询集合中的所有文档
db.<collection>.find()

// 查询符合条件的文档
db.<collection>.find({<field>: <value>})

// 使用比较操作符进行查询(例如:$gt, $lt, $eq, $ne等)
db.<collection>.find({<field>: {$gt: <value>}})

// 查询指定字段包含某个值的文档(数组字段)
db.<collection>.find({<arrayField>: <value>})

// 查询指定字段包含数组中所有值的文档
db.<collection>.find({<arrayField>: {$all: [<value1>, <value2>, ...]}})

// 使用逻辑操作符进行查询($and, $or, $not, $nor)
db.<collection>.find({$or: [{<field1>: <value1>}, {<field2>: <value2>}]})

// 使用$in操作符查询字段值在指定数组内的文档
db.<collection>.find({<field>: {$in: [<value1>, <value2>, ...]}})

// 查询文档中存在指定字段的文档
db.<collection>.find({<field>: {$exists: true}})

// 使用正则表达式进行查询
db.<collection>.find({<field>: {$regex: <pattern>}})

// 限制查询结果数量
db.<collection>.find().limit(<number>)

// 跳过指定数量的查询结果
db.<collection>.find().skip(<number>)

// 对查询结果进行排序(1为升序,-1为降序)
db.<collection>.find().sort({<field>: 1})

// 计算符合查询条件的文档数量
db.<collection>.find({<condition>}).count()

// 在查询中使用投影,限制返回的字段
db.<collection>.find({<condition>}, {<field1>: 1, <field2>: 1})

// 使用聚合管道进行复杂查询
db.<collection>.aggregate([
  { $match: {<condition>} },
  { $group: {_id: "$<field>", count: {$sum: 1}} },
  { $sort: {count: -1} }
])

// 使用$lookup进行集合间的连接查询
db.<collection>.aggregate([
  { 
    $lookup: {
      from: "<otherCollection>",
      localField: "<localField>",
      foreignField: "<foreignField>",
      as: "<outputArrayField>"
    } 
  }
])

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

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

相关文章

百度云加速即将下线

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 松松商城作为多年百度云加速代理商&#xff0c;上周接到通知&#xff1a;百度云加速产品计划于2024年4月30日下线&#xff0c;目前也无法做实名了。 同时&#xff0c;百度云加速也开始逐步迁移到百度云&#xff0…

构造函数、原型、instanceof运算符

通过构造函数创建对象 构造函数是学习面向对象的基础 任何函数都有原型对象 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.…

卡尔曼滤波器笔记——最详细

笔记来源— 卡尔曼滤波算法原理及代码实现&#xff01;https://www.bilibili.com/video/BV1WZ4y1F7VN/?spm_id_from333.337.search-card.all.click&vd_source8d55784dc9c7530bc9e3fa220380be56 简单介绍一下 现在我们就是不知道是距离多少&#xff0c;就需要用到这个卡尔…

C++进阶--mep和set的模拟实现

红黑树链接入口 底层容器 模拟实现set和map时常用的底层容器是红黑树。 红黑树是一种自平衡的搜索二叉树&#xff0c;通过对节点进行颜色标记来保持平衡。 在模拟实现set和map时&#xff0c;可以使用红黑树来按照元素的大小自动排序&#xff0c;并且保持插入和删除操作的高效…

缓冲区与C库函数的实现

目录 一、缓冲区 二、C库函数的实现 一、缓冲区 缓冲区本质就是一块内存&#xff0c;而缓冲区存在的意义本质是提高使用者(用户)的效率【把缓冲区理解成寄送包裹的菜鸟驿站】 缓冲区的刷新策略 1. 无缓冲(立即刷新) 2. 行缓冲(行刷新) 3. 全缓冲(缓冲区满了&#xff0c;再刷…

三. 操作系统 (6分) [理解|计算]

🌟三. 操作系统 (6分) [理解|计算] PV操作, 分页存储管理, 文件的索引, 位示图 考试重点 文章目录 🌟三. 操作系统 (6分) [理解|计算]==PV操作, 分页存储管理, 文件的索引, 位示图 考试重点==3.1 进程管理3.2 存储管理3.3 设备管理3.4 文件管理3.1 进程管理 进程的特征 进…

部署docker仓库harbor

1、下载包 1、包已上传有两个harbor.v2.6.0.tar与harbor.tar 2、harbor.tar解压后会生成harbor目录&#xff0c;将harbor.v2.6.0.tar移动到harbor目录下。 3、执行harbor目录下的install.sh 4、执行完后修改配置文件 2、修改配置文件 vim /root/harbor/make/ harbor.yml.tmpl …

【JAVA】CSS3:3D、过渡、动画、布局、伸缩盒

1 3D变换 1.1 3D空间与景深 /* 开启3D空间,父元素必须开启 */transform-style: preserve-3d;/* 设置景深&#xff08;你与z0平面的距离 */perspective:50px; 1.2 透视点位置 透视点位置&#xff1a;观察者位置 /* 100px越大&#xff0c;越感觉自己边向右走并看&#xff0c;…

亚信安慧AntDB:系统稳定性的守护

在国产化升级改造的过程中&#xff0c;AntDB不断地适应不同的需求&#xff0c;为用户提供个性化的解决方案。其致力于确保数据安全和系统稳定&#xff0c;预防数据泄露和系统崩溃等问题的发生。AntDB的团队不仅专注于技术的提升和创新&#xff0c;更关注用户的实际需求&#xf…

Docker 笔记(五)--链接

这篇笔记记录了Docker 的Link。 官方文档&#xff1a; Legacy container links - Communication across links 目录 参考Legacy container linksConnect using network port mappingConnect with the linking systemThe importance of naming Communication across linksEnviro…

《IAB视频广告标准:综合指南(2022)》之概述篇 - 我为什么要翻译介绍美国人工智能科技公司IAB 系列(2)

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先后为700多家媒体…

漫步者、南卡、Oladance开放式耳机怎么样?巅峰测评谁是公认力作

​最近朋友们经常向我询问开放式耳机的选择问题&#xff0c;他们购买了开放式耳机后发现音质不佳&#xff0c;上耳佩戴舒适性几乎为零。市面上的开放式耳机琳琅满目&#xff0c;大家不知道该如何选择。漫步者、南卡、Oladance开放式耳机怎么样&#xff1f;我作为音乐爱好者已经…

Java实现PDF文字内容识别,结合OCR实现PDF图片实现

使用插件&#xff1a;UMI-OCR、PDFBOX 实现思路&#xff1a;通过PDFBOX识别PDF文字&#xff0c;如果是图片&#xff0c;则识别不出来&#xff0c;再调用OCR进行识别返回文字&#xff1b;OCR识别较慢&#xff0c;长图识别不出来&#xff0c;目前HTTP方式只支持图片格式&#xf…

变量柱塞液压泵比例阀放大器

液压泵把动力机的能转换成液压的压力能。使用在开式和闭式系统里在固定和移动的设备上&#xff0c;通过电比例放大器控制比例阀线圈驱动液流方向压力流量。BEUEC比例放大器适用控制方式&#xff1a;电比例控制&#xff08;12VDC、24VDC&#xff09;&#xff0c;控制闭式泵系列4…

消费补贴模式,刺激消费需求,重塑商业格局

​小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 在…

小明的背包——01背包问题

经典版 题目链接&#xff1a;1.小明的背包1 - 蓝桥云课 (lanqiao.cn) 01背包问题中&#xff0c;每种物品只有两种状态&#xff0c;即拿或不拿。设状态dp[i][j]max(dp[i-1][j],dp[i-1][j-w]v)&#xff1b;如果不拿物品i&#xff0c;那么最大价值就是dp[i-1][j]&#xff0c;如果…

【软件工具】网络性能测试工具 Iperf

Iperf 是一款专业的开源网络性能测试工具&#xff0c;它被广泛用于测量网络带宽、延迟、抖动和数据包丢失等网络性能指标&#xff0c;支持 TCP 和 UDP 等&#xff0c;可用于点对点或客户端-服务器等模式的网络测试。 软件获取 官方下载地址&#xff1a;https://iperf.fr/iper…

最新若依项目快速上手

最新若依项目快速上手 配套视频&#xff1a;若依项目快速上手视频 1. 下载源码 官网&#xff1a;https://ruoyi.vip/ 前端 git clone https://github.com/yangzongzhuan/RuoYi-Vue3.git后端 git clone https://gitee.com/y_project/RuoYi-Vue.git2. 数据库 创建数据库ry-vue…

Day32:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

目录 JavaEE-HTTP-Servlet&路由&周期 JavaEE-数据库-JDBC&Mybatis&库 思维导图 Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架…

在线编辑字体工具,支持对字体查看编码以及编辑

公司一个沉寂多年的项目需要进行二开&#xff0c;前面的开发的同学已经离开&#xff0c;对于项目情况了解较少&#xff0c;开发的时候发现缺失很多小图标&#xff0c;但是对原来有那些图标也不太了解 目标 1、知晓字体包里的旧的图标是什么样子的&#xff1f;2、在旧字体包中导…