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.pswp.cn/pingmian/80013.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80013.shtml
英文地址,請注明出處:http://en.pswp.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;右…