MongoDB常用操作示例

以下是基于 MongoDB Shell 的完整操作示例,覆盖数据库管理、集合操作、文档处理、聚合分析、索引管理等核心功能,并结合实际场景说明。所有示例均结合搜索结果中的技术要点整理而成。


一、连接与配置管理

1. 启动 MongoDB Shell 并连接实例

# 默认连接本地 27017 端口
mongo# 连接远程实例并认证
mongo -u admin -p password --host rs0/centos1104 --port 27500

说明:通过 --host--port 指定实例地址,-u-p 提供认证信息。

2. 配置 .mongorc.js 自动加载脚本

在用户目录下创建 .mongorc.js 文件:

// 每次启动 Shell 时自动切换到 test 数据库
use test;
print("已自动切换到 test 数据库");

作用:初始化 Shell 环境,简化重复操作。


二、数据库与集合管理

1. 数据库操作

// 查看所有数据库
show dbs;// 创建并切换到新数据库
use mydb;// 删除当前数据库
db.dropDatabase();

注意:MongoDB 在插入数据前不会物理创建数据库。

2. 集合操作

// 显式创建集合(可指定配置)
db.createCollection("users", { capped: true, size: 100000 });// 查看当前数据库的所有集合
show collections;// 重命名集合
db.users.renameCollection("new_users");// 删除集合
db.new_users.drop();

说明:capped 集合为固定大小的循环集合,适合日志场景。


三、文档操作(CRUD)

1. 插入文档

// 插入单条文档
db.users.insertOne({ name: "Bob", age: 25, email: "bob@example.com",hobbies: ["reading", "gaming"]
});// 插入多条文档
db.users.insertMany([{ name: "Alice", age: 30, status: "active" },{ name: "Charlie", age: 22, status: "inactive" }
]);

特性:支持嵌套数组(如 hobbies)和动态模式。

2. 查询文档

// 查询所有文档
db.users.find();// 条件查询(精确匹配)
db.users.find({ status: "active" });// 范围查询(年龄大于 25)
db.users.find({ age: { $gt: 25 } });// 数组查询(包含 "gaming" 的 hobbies)
db.users.find({ hobbies: "gaming" });// 投影(仅显示 name 和 email 字段)
db.users.find({}, { name: 1, email: 1, _id: 0 });

高级用法:$gt 表示大于,1 表示包含字段,0 表示排除。

3. 更新文档

// 更新单条文档
db.users.updateOne({ name: "Bob" }, { $set: { age: 26 },$push: { hobbies: "traveling" }}
);// 更新多条文档
db.users.updateMany({ status: "inactive" }, { $set: { status: "pending" } }
);

操作符:$set 修改字段,$push 向数组添加元素。

4. 删除文档

// 删除单条文档
db.users.deleteOne({ name: "Charlie" });// 删除多条文档
db.users.deleteMany({ age: { $lt: 20 } });

注意:删除操作不可逆,建议先使用 find() 确认条件。


四、查询进阶技巧

1. 正则匹配查询

// 查找 name 以 "A" 开头的文档
db.users.find({ name: /A.*/i });

说明:/i 表示忽略大小写。

2. 使用 $where 执行 JavaScript 函数

// 查询 age 字段为偶数的文档
db.users.find({$where: function() {return (this.age % 2 === 0);}
});

限制:性能较低,慎用于大数据集。


五、聚合管道(Aggregation Pipeline)

1. 基础聚合统计

// 按 status 分组并统计数量
db.users.aggregate([{ $group: { _id: "$status", count: { $sum: 1 } } }
]);

输出示例:

{ "_id": "active", "count": 3 }
{ "_id": "pending", "count": 2 }

说明:$group 阶段按字段分组,$sum 累加计数。

2. 多阶段聚合(过滤+分组+排序)

db.users.aggregate([{ $match: { age: { $gt: 20 } } },      // 过滤年龄 >20 的用户{ $group: {                             // 按状态分组_id: "$status", avgAge: { $avg: "$age" },            // 计算平均年龄total: { $sum: 1 }                   // 统计数量}},{ $sort: { avgAge: -1 } }              // 按平均年龄降序排序
]);

输出示例:

{ "_id": "active", "avgAge": 31.5, "total": 4 }
{ "_id": "pending", "avgAge": 28.0, "total": 2 }

特性:支持多阶段链式处理,适合复杂分析场景。


六、索引管理

1. 创建索引

// 为 name 字段创建升序索引
db.users.createIndex({ name: 1 });// 为 email 创建唯一索引
db.users.createIndex({ email: 1 }, { unique: true });

说明:1 表示升序,-1 表示降序。

2. 查看索引

// 查看集合的所有索引
db.users.getIndexes();// 查看数据库所有集合的索引
db.getCollectionNames().forEach(function(collection) {print("Index for " + collection);printjson(db[collection].getIndexes());
});

用途:诊断索引性能瓶颈。


七、事务处理(需副本集环境)

// 启动事务
const session = db.getMongo().startSession();
session.startTransaction();try {// 在事务中执行操作db.accounts.updateOne({ name: "Alice" }, { $inc: { balance: -500 } }, { session });db.accounts.updateOne({ name: "Bob" }, { $inc: { balance: 500 } }, { session });// 提交事务session.commitTransaction();
} catch (error) {// 出错回滚session.abortTransaction();throw error;
}

限制:需 MongoDB 4.2+ 副本集环境,支持多文档原子操作。


八、备份与恢复

1. 使用 mongodump 备份数据

# 备份整个数据库
mongodump --host rs0/centos1104 --port 27500 -u admin -p password --db test --out /backup/# 仅备份特定集合
mongodump --collection users --db test --out /backup/

2. 使用 mongorestore 恢复数据

# 从备份恢复
mongorestore --host rs0/centos1104 --port 27500 -u admin -p password /backup/test/

注意:恢复前需确保目标数据库不存在冲突集合。


九、权限管理

1. 创建数据库账号

// 在 admin 数据库中创建管理员账号
use admin;
db.createUser({user: "admin_user",pwd: "secure_password",roles: [{ role: "userAdminAnyDatabase", db: "admin" },{ role: "readWriteAnyDatabase", db: "admin" }]
});

2. 授予集合级别权限

// 在 test 数据库中创建只读账号
use test;
db.createUser({user: "readonly",pwd: "123456",roles: [{ role: "read", db: "test" }]
});

说明:权限模型遵循最小权限原则,适合生产环境安全控制。


以上示例覆盖 MongoDB Shell 的核心操作,实际应用中需结合具体业务需求调整参数和逻辑。更多细节可参考 MongoDB 官方文档及搜索结果中的技术说明。

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

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

相关文章

C++ 模板方法模式详解与实例

模板方法模式概念​ 模板方法模式(Template Method Pattern)属于行为型设计模式,其核心思想是在一个抽象类中定义一个算法的骨架,而将一些步骤延迟到子类中实现。这样可以使得子类在不改变算法结构的情况下,重新定义算法中的某些步骤。它通过继承机制,实现代码复用和行为…

MySQL基础关键_012_事务

目 录 一、概述 二、ACID 四大特性 三、MySQL 事务 四、事务隔离级别 1.说明 2.现象 (1)脏读 (2)不可重复读 (3)幻读 3.查看隔离级别 4.设置隔离级别 5.隔离级别 (1)初始…

Hutool中的Pair类详解

1. Pair类概述 Hutool工具库中的Pair类是一个简单的键值对数据结构,用于存储两个相关联的对象。它类似于Map的Entry,但更加轻量级,适用于需要临时存储两个相关联数据的场景。 2. Pair类的主要特点 简单轻量:不依赖复杂的数据结…

02-GBase 8s 事务型数据库 客户端工具dbaccess

dbaccess概述 数据库产品通常会提供一个命令行客户端工具。 数据库厂商 命令行客户端 Oracle sqlplus MySQL mysql Marladb mysql GBase 8s dbaccess Kingbase ES ksql DM8 disql dbaccess 是 GBase 8s 数…

手撕基于AMQP协议的简易消息队列-8(单元测试的编写)

在MQTest中编写模块的单元测试 在MQTest中编写makefile文件来编译客户端模块 all:Test_FileHelper Test_Exchange Test_Queue Test_Binding Test_Message Test_VirtualHost Test_Route Test_Consumer Test_Channel Test_Connection Test_VirtualHost:Test_VirtualHost.cpp ..…

Spark 之 metrics

peak memory.//sql/core/src/main/scala/org/apache/spark/sql/execution/aggregate/HashAggregateExec.scala: “peakMemory” -> SQLMetrics.createSizeMetric(sparkContext, “peak memory”), .//sql/core/src/main/scala/org/apache/spark/sql/execution/SortExec.scal…

HTTP/HTTPS协议(请求响应模型、状态码)

目录 HTTP/HTTPS协议简介 HTTP协议 HTTPS协议 请求 - 响应模型 HTTP请求 (二)HTTP响应 HTTPS协议与HTTP协议在请求 - 响应模型中的区别 HTTP/HTTPS协议简介 HTTP协议 定义 HTTP(HyperText Transfer Protocol)即超文本传输…

OpenHarmony 5.0 切换已连接过的wifi切换失败

目录 1.背景 2.流程分析 3.方案 1.背景 在OpenHarmony 5.0的设置中,输入密码进行wifi连接可以正常连接,然后多个已经连接过的wifi进行切换发现大概率切换失败 2.流程分析 wifi连接过程其实是先进行断开当前的wifi连接,然后再连接另一个wifi,如下: 虽然上述流程看起来没…

【Ollama】docker离线部署Ollama+deepseek

因为要做项目,实验室的服务器不联网,所以只能先打包一个基础的docker环境,然后再在实验室的服务器上进行解压和配置环境 参考:https://zhuanlan.zhihu.com/p/23377266873 1.打包基础的docker环境 这里最好用有cuda的&#xff0c…

如何使用极狐GitLab 软件包仓库功能托管 terraform?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 Terraform 模块库 (BASIC ALL) 基础设施仓库和 Terraform 模块仓库合并到单个 Terraform 模块仓库功能引入于极狐GitLab 15.1…

【QT】深入理解 Qt 中的对象树:机制、用途与最佳实践

深入理解 Qt 中的对象树:机制、用途与最佳实践 在使用 Qt 编程时,你是否注意到很多对象可以设置“父对象”?比如: QPushButton* btn new QPushButton(parentWidget);这不是简单的层级结构,而是 Qt 强大而优雅的 对象…

比较入站和出站防火墙规则

组织需要仔细配置防火墙规则,监控网络的传入和传出流量,从而最大限度降低遭受攻击的风险。在有效管理入站和出站防火墙规则前,了解入站与出站流量的区别至关重要。 一、什么是入站流量? 入站流量指的是并非源自网络内部&#xf…

Unity-Shader详解-其五

关于Unity的Shader部分的基础知识其实已经讲解得差不多了,今天我们来一些实例分享: 溶解 效果如下: 代码如下: Shader "Chapter8/chapter8_1" {Properties{// 定义属性[NoScaleOffset]_Albedo("Albedo", 2…

COLT_CMDB_linux_userInfo_20250508.sh修复历史脚本输出指标信息中userName与输出信息不一致问题

#!/bin/bash #IT_BEGIN #IT_TYPE3 #IT SYSTEM_LINUX_AGENTUSERDISCOVER|discovery.user[disc] #原型指标 #IT_RULE SYSTEM_LINUX_AGENTUSERGROUPID|groupId[{#USERNAME}] #IT_RULE SYSTEM_LINUX_AGENTUSERHOME|userHome[{#USERNAME}] #IT_RULE SYSTEM_LINUX_AGENTUSERNAME|user…

TCP 与 UDP报文

** TCP 与 UDP报文** 1. 引言 在网络通信中,TCP(传输控制协议) 和 UDP(用户数据报协议) 是两种最核心的传输层协议。它们各自适用于不同的场景,理解其工作原理对开发高性能网络应用至关重要。本文将详细解…

LabVIEW燃气轮机测控系统

在能源需求不断增长以及生态环境保护备受重视的背景下,微型燃气轮机凭借其在经济性、可靠性、维护性及排放性等方面的显著优势,在航空航天、分布式发电等众多领域得到广泛应用。随着计算机技术的快速发展,虚拟仪器应运而生,LabVIE…

基于vueflow可拖拽元素的示例(基于官网示例的单文件示例)

效果图 代码 <template><div style"width: 100%;height: calc(100vh - 84px)"><VueFlow :nodes"nodes" :edges"edges" drop"onDrop" dragover"onDragOver" dragleave"onDragLeave"><div cl…

笔试专题(十六)

文章目录 相差不超过k的最多数题解代码 最长公共子序列&#xff08;一&#xff09;题解代码 小红的口罩题解代码 春游题解代码 相差不超过k的最多数 题目链接 题解 1. 排序 滑动窗口 2. 为什么使用滑动窗口&#xff1f; 因为max-min < k&#xff0c;求这个区间内的数最…

技术视界 | 青龙机器人训练地形详解(三):复杂地形精讲之台阶

在前两篇中&#xff0c;我们依次讲解了“如何创建一个地形”以及“如何将地形添加到训练环境中”。从基础出发&#xff0c;逐步构建机器人可交互的三维仿真环境。在机器人强化学习训练中&#xff0c;地形的复杂度决定了策略的泛化能力&#xff0c;仅靠 jump_plat 和 jump_pit 等…

MYSQL之索引结构,为何要用B+树

索引的目的就是为了提高查询效率 索引的结构是B树&#xff0c;那么说到B树&#xff0c;必须提一下其他三种结构&#xff0c;分别是&#xff1a;二叉查找树、平衡二叉树、B树 我们来看看各自的结构特征 二叉查找树 特点:任何节点的左子节点的值都小于当前节点的值&#xff0c;右…