MongoDB 常用增刪改查方法及示例

MongoDB 的增刪改查(CRUD)操作是其核心功能,主要通過 mongo shell 或驅動(如 Node.js、Python 等)實現。以下是最常用操作的詳細說明及示例(基于 mongo shell 語法)。

?一、插入操作(Insert)??

用于向集合中添加文檔,支持插入單條或多條數據。

?**1. 插入單條文檔:insertOne()**?

向集合中插入一個文檔,返回操作結果(包含是否成功、插入的 _id 等信息)。

?語法?:

db.collection.insertOne({<field1>: <value1>,<field2>: <value2>,...
})

?示例?:
users 集合插入一條用戶記錄:

// 若集合不存在,MongoDB 會自動創建
db.users.insertOne({name: "Alice",age: 25,email: "alice@example.com",hobbies: ["reading", "hiking"],isStudent: false
})

?輸出結果?:

{"acknowledged": true,    // 操作是否被服務端確認(默認開啟寫確認)"insertedId": ObjectId("650a8b9d0f7d0e1a2c3b4d5e")  // 自動生成的唯一 _id
}
?**2. 插入多條文檔:insertMany()**?

向集合中批量插入多個文檔,適合初始化數據或批量導入。

?語法?:

db.collection.insertMany([{ <doc1> },{ <doc2> },...
])

?示例?:
插入 3 條用戶記錄:

db.users.insertMany([{name: "Bob",age: 30,email: "bob@example.com",hobbies: ["gaming", "coding"]},{name: "Charlie",age: 22,email: "charlie@example.com",isStudent: true},{name: "Diana",age: 28,email: "diana@example.com",hobbies: ["painting"],isStudent: false}
])

?輸出結果?:

{"acknowledged": true,"insertedIds": [ObjectId("650a8ba90f7d0e1a2c3b4d5f"),ObjectId("650a8ba90f7d0e1a2c3b4d60"),ObjectId("650a8ba90f7d0e1a2c3b4d61")]
}

?二、查詢操作(Query)??

用于從集合中檢索符合條件的文檔,核心方法是 find()findOne()

?**1. 基礎查詢:find()**?

返回所有符合條件的文檔(默認返回所有字段),支持條件過濾、投影(指定返回字段)、排序、分頁等。

?語法?:

db.collection.find(<query>, <projection>)
  • <query>:查詢條件(類似 SQL 的 WHERE 子句)。
  • <projection>:可選,指定返回的字段(1 表示包含,0 表示排除,不能混合使用 _id 與其他字段外的 10)。

?示例?:

??(1) 無過濾查詢(返回所有文檔)??
db.users.find()  // 返回 users 集合的所有文檔
??(2) 條件查詢(過濾文檔)??

使用 ?查詢操作符?(如 $eq$gt$lt$in 等)定義條件。

  • ?示例 1:精確匹配?($eq
    查詢 name 為 "Alice" 的文檔:

    db.users.find({ name: { $eq: "Alice" } })
    // 等價于簡寫:db.users.find({ name: "Alice" })
  • ?示例 2:范圍查詢?($gt 大于,$lt 小于)
    查詢年齡大于 25 歲的用戶:

    db.users.find({ age: { $gt: 25 } })
  • ?示例 3:包含查詢?($in 匹配數組中的任意值)
    查詢郵箱在 ["alice@example.com", "diana@example.com"] 中的用戶:

    db.users.find({ email: { $in: ["alice@example.com", "diana@example.com"] } })
  • ?示例 4:嵌套字段查詢?(點符號 . 訪問嵌套字段)
    假設文檔有嵌套結構(如 address.city):

    // 插入一條帶嵌套字段的文檔:
    db.users.insertOne({name: "Eve",address: { city: "Beijing", zip: "100000" }
    })// 查詢城市為 Beijing 的用戶:
    db.users.find({ "address.city": "Beijing" })
  • ?示例 5:正則表達式查詢?($regex
    查詢 name 以 "A" 開頭的用戶:

    db.users.find({ name: { $regex: "^A" } })  // 輸出 Alice(假設存在)
?2. 投影(Projection)??

控制返回的字段,減少網絡傳輸量。

?語法?:

db.collection.find(<query>, { <field1>: 1, <field2>: 0 })
  • _id 字段默認返回,若需排除需顯式設置 "_id": 0

?示例?:
查詢所有用戶,但只返回 nameemail 字段:

db.users.find({}, { name: 1, email: 1, _id: 0 })

?輸出結果?:

{ "name" : "Alice", "email" : "alice@example.com" }
{ "name" : "Bob", "email" : "bob@example.com" }
...
?3. 排序、分頁與統計?
  • ?排序?:使用 sort() 方法(1 升序,-1 降序)。
    示例:按年齡升序排序:

    db.users.find().sort({ age: 1 })
  • ?分頁?:使用 skip(n)(跳過前 n 條)和 limit(m)(限制返回 m 條)。
    示例:查詢第 2 頁(每頁 2 條):

    db.users.find().skip(2).limit(2)  // 跳過前 2 條,取 2 條
  • ?統計數量?:使用 countDocuments()(統計符合條件的文檔數)。
    示例:統計年齡大于 25 歲的用戶數量:

    db.users.countDocuments({ age: { $gt: 25 } })
?**4. 單條文檔查詢:findOne()**?

返回符合條件的第一條文檔?(適合快速獲取單條數據)。

?語法?:

db.collection.findOne(<query>, <projection>)

?示例?:
查詢 name 為 "Bob" 的第一條文檔:

db.users.findOne({ name: "Bob" })

?三、更新操作(Update)??

用于修改集合中的文檔,支持部分更新(僅修改指定字段)或全量替換。核心方法是 updateOne()updateMany()replaceOne()

?**1. 更新單條文檔:updateOne()**?

更新第一條符合條件的文檔,返回操作結果(包含是否成功、修改的文檔數等)。

?語法?:

db.collection.updateOne(<query>,          // 查詢條件(匹配要更新的文檔)<update>,         // 更新操作(使用更新操作符)<options>         // 可選參數(如 upsert: true 表示不存在則插入)
)

?關鍵更新操作符?(必須配合使用,否則會覆蓋整個文檔):

  • $set:設置字段的值(若字段不存在則創建)。
  • $inc:對數值型字段遞增/遞減。
  • $push:向數組字段末尾添加元素。
  • $pull:從數組字段中移除指定元素。
  • $unset:刪除指定字段。

?示例?:

??(1) 使用 $set 修改字段?

name 為 "Alice" 的用戶的 email 修改為 "alice.new@example.com":

db.users.updateOne({ name: "Alice" },{ $set: { email: "alice.new@example.com" } }
)

?輸出結果?:

{"acknowledged": true,"matchedCount": 1,    // 匹配到的文檔數"modifiedCount": 1    // 實際修改的文檔數(若字段未變化則為 0)
}
??(2) 使用 $inc 遞增數值?

name 為 "Bob" 的用戶的 age 加 1:

db.users.updateOne({ name: "Bob" },{ $inc: { age: 1 } }
)
??(3) 使用 $push 向數組添加元素?

name 為 "Charlie" 的用戶的 hobbies 數組添加 "swimming":

db.users.updateOne({ name: "Charlie" },{ $push: { hobbies: "swimming" } }
)
??(4) 使用 $unset 刪除字段?

刪除 name 為 "Diana" 的用戶的 isStudent 字段:

db.users.updateOne({ name: "Diana" },{ $unset: { isStudent: "" } }  // 值可以是任意(通常用空字符串)
)
?**2. 更新多條文檔:updateMany()**?

更新所有符合條件的文檔(與 updateOne() 僅匹配數量不同)。

?示例?:
將所有年齡小于 28 歲的用戶的 isStudent 字段設為 true

db.users.updateMany({ age: { $lt: 28 } },{ $set: { isStudent: true } }
)
?**3. 全量替換文檔:replaceOne()**?

用新文檔完全替換匹配到的第一條文檔(原字段會被覆蓋,僅保留 _id)。

?語法?:

db.collection.replaceOne(<query>,    // 查詢條件<replacementDoc>  // 替換的新文檔(不能包含操作符如 $set)
)

?示例?:
name 為 "Eve" 的用戶替換為新文檔(僅保留 _id):

db.users.replaceOne({ name: "Eve" },{newName: "Eve Smith",  // 原 name 字段被覆蓋age: 30,email: "eve.smith@example.com"}
)

?四、刪除操作(Delete)??

用于刪除集合中的文檔,核心方法是 deleteOne()deleteMany()

?**1. 刪除單條文檔:deleteOne()**?

刪除第一條符合條件的文檔。

?語法?:

db.collection.deleteOne(<query>)

?示例?:
刪除 name 為 "Charlie" 的第一條文檔:

db.users.deleteOne({ name: "Charlie" })

?輸出結果?:

{"acknowledged": true,"deletedCount": 1  // 實際刪除的文檔數
}
?**2. 刪除多條文檔:deleteMany()**?

刪除所有符合條件的文檔。

?示例?:
刪除所有年齡大于 30 歲的用戶:

db.users.deleteMany({ age: { $gt: 30 } })
?注意?:
  • 刪除操作不可逆,建議先使用 find() 確認匹配的文檔,再執行刪除。
  • 若需清空集合,可使用 db.collection.deleteMany({})(謹慎!)。

?五、聚合查詢(Aggregate)??

用于復雜數據處理(如分組、統計、關聯等),通過聚合管道?(多個階段依次處理)實現。

?核心階段(Stage)??
  • $match:過濾文檔(類似 find())。
  • $group:按指定字段分組,計算聚合值(如求和、計數)。
  • $project:投影(指定輸出字段)。
  • $sort:排序。
  • $limit:限制輸出數量。
?示例:統計各城市的用戶數量?

需求:按 address.city 分組,統計每個城市的用戶數。

?聚合管道?:

db.users.aggregate([{ $match: { "address.city": { $exists: true } } },  // 過濾有城市的文檔{ $group: {                                         // 分組統計_id: "$address.city",                             // 分組依據(城市名)count: { $sum: 1 }                                // 每組計數 +1}},{ $sort: { count: -1 } }                            // 按數量降序排序
])

?輸出結果?(假設):

[{ "_id" : "Beijing", "count" : 2 },{ "_id" : "Shanghai", "count" : 1 }
]

?總結?

MongoDB 的 CRUD 操作圍繞文檔的增刪改查展開,核心方法包括:

  • ?插入?:insertOne()insertMany()
  • ?查詢?:find()(含投影、排序、分頁)、findOne()
  • ?更新?:updateOne()(部分更新)、updateMany()(批量更新)、replaceOne()(全量替換)
  • ?刪除?:deleteOne()deleteMany()
  • ?高級查詢?:聚合管道(aggregate())處理復雜統計。

實際使用中,需根據業務需求選擇合適的操作方法,并注意索引優化(如為常用查詢字段創建索引)以提升性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87162.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87162.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87162.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

moodle升級(4.5到5.0)

升級目標 由Moodle 4.5 (Build: 20241129) 升級到Moodle 5.0.1 (Build: 20250629) 參考教程&#xff1a;moodle升級&#xff08;詳細版&#xff09;-CSDN博客 操作平臺&#xff1a;寶塔 通過寶塔進行備份 備份文件 將/www/wwwroot/moodle 和/www/wwwroot/moodledata 復制…

基于Apache POI實現百度POI分類快速導入PostgreSQL數據庫實戰

## 引言:POI數據的價值與挑戰 POI(Point of Interest)數據作為地理信息系統的核心要素,在智慧城市、位置服務、商業分析等領域具有重要價值。百度POI數據包含了豐富的地點信息(如名稱、類別、坐標等),但如何高效處理這些數據并將其導入數據庫進行分析是開發者面臨的挑戰…

linux LAMP 3

[rootcode apache2]# bin/apachectl AH00558: httpd: Could not reliably determine the server’s fully qualified domain name, using fe80::20c:29ff:fe2a:708a. Set the ‘ServerName’ directive globally to suppress this message root192.168.235.5s password:┌─…

UI自動化-Selenium WebDriver

前言 Selenium WebDriver 是 Selenium 項目中最核心、最強大的組件&#xff0c;它是一個用于自動化控制網頁瀏覽器的開源 API&#xff08;應用程序編程接口&#xff09;。 簡單來說&#xff0c;Selenium WebDriver 就是一個允許你用編程語言&#xff08;如 Java、Python、C#、…

具身多模態大模型在感知與交互方面的綜述

引言在本學期方老師的《機器人與大模型》課上&#xff0c;我首次接觸到了關于具身智能的前沿知識&#xff0c;尤其作為課上交互組的成員&#xff0c;從表情識別到語音交互到機械狗的開發實踐進行了一些有意思的探索&#xff0c;使我在其中感受到了具身智能的巨大魅力和無限潛力…

UI 設計|審美積累 | 擬物化風格(Skeuomorphism)

擬物化是指把現實世界的材質、光影和結構帶到數字界面中。木紋、金屬、皮革、紙張等真實物體的質感&#xff0c;被細致地還原到屏幕上&#xff0c;讓用戶一眼就明白元素的意義與操作方式。它曾是iOS6之前移動端設計的主流風格&#xff0c;也一度被極簡風格取代&#xff0c;但在…

EventBridge精準之道:CloudTrail事件 vs. 服務原生事件,我該如何選?

當我們深入使用AWS EventBridge時&#xff0c;常常會發現一個有趣的現象&#xff1a;對于同一個操作&#xff08;比如啟動一個EC2實例&#xff09;&#xff0c;EventBridge中似乎會出現兩種事件。一種來自CloudTrail&#xff0c;記錄了API調用的行為&#xff1b;另一種則直接來…

【算法】動態規劃 斐波那契類型: 740. 刪除并獲得點數

740. 刪除并獲得點數 中等 題目 給你一個整數數組 nums &#xff0c;你可以對它進行一些操作。 每次操作中&#xff0c;選擇任意一個 nums[i] &#xff0c;刪除它并獲得 nums[i] 的點數。之后&#xff0c;你必須刪除 所有 等于 nums[i] - 1 和 nums[i] 1 的元素。 開始你…

AWS MySQL 讀寫分離配置指南

# AWS JDBC Wrapper讀寫分離配置實戰&#xff1a;Spring Boot MyBatis Plus完整解決方案 ## 前言 在微服務架構中&#xff0c;數據庫讀寫分離是提升系統性能的重要手段。本文將詳細介紹如何在Spring Boot項目中使用AWS JDBC Wrapper實現自動讀寫分離&#xff0c;重點解決MyBat…

opencv檢測運動物體

檢測到的所有移動物體中輪廓中找到面積最大的輪廓&#xff0c;并繪制這個輪廓的矩形框。 #include <opencv2/opencv.hpp> #include <iostream>int main() {// 打開視頻文件或攝像頭cv::VideoCapture capture;capture.open("move3.mp4"); // 打開視頻文件…

Camera相機人臉識別系列專題分析之十五:人臉特征檢測FFD算法之libcvface_api.so算法API詳細注釋解析

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: Camera相機人臉識別系列專題分析之十五:人臉特征檢測FFD算法之libcvface_api.so算法API詳細注釋解析 目錄 一、libcvface_api.so算法API詳細注釋解析

圖像擦除論文-2:SmartEraser、Erase Diffusion、OmniEraser

圖像生成模型應用系列——圖像擦除&#xff1a; 圖像擦除論文-1&#xff1a;PixelHacker、PowerPanint等 圖像擦除論文-2&#xff1a;擦除類型數據集構建(1) Erase Diffusion Erase Diffusion: Empowering Object Removal Through Calibrating Diffusion Pathways https://git…

九識無人車陜西運營中心展廳啟幕 打造智能城配物流新標桿

7月1日&#xff0c;九識無人車陜西運營中心展廳正式開業&#xff0c;全國業務版圖再添重要一子。這座展廳是九識在陜西省的首家展廳&#xff0c;由九識第一位正式提車的客戶、首位代理商伙伴孫朋奇先生打造。展廳集產品展示與技術體驗于一體&#xff0c;成為西北地區城配領域自…

AI智能體|扣子(Coze)搭建【沉浸式歷史故事解說視頻】工作流

主包講解歷史對我們的好處&#xff0c;純個人觀點&#xff01; 這個世界是存在一些規律的&#xff0c;很多東西并不能夠通過自己的聰明去創新&#xff0c;去改變的。 無論你怎么樣創新&#xff0c;你都會回到哪個規律中去&#xff0c;比如很多人做一些商業模式的創新&#xff0…

Softhub軟件下載站實戰開發(十):實現圖片視頻上傳下載接口

文章目錄 Softhub軟件下載站實戰開發&#xff08;十&#xff09;&#xff1a;實現圖片視頻上傳下載接口 &#x1f5bc;?&#x1f3a5;系統架構圖核心功能設計 &#x1f6e0;?1. 文件上傳流程2. 關鍵技術實現2.1 雪花算法2.2 文件校驗機制 ?2.3 文件去重機制 &#x1f50d;2.…

[JS逆向] 喜馬拉雅登錄案例 -- 補環境

博客配套代碼發布于github&#xff1a;喜馬拉雅登錄 &#xff08;歡迎順手Star一下?&#xff09; 相關知識點&#xff1a;webpack 補環境 相關爬蟲專欄&#xff1a;JS逆向爬蟲實戰 爬蟲知識點合集 爬蟲實戰案例 逆向知識點合集 此案例目標為逆向成功對應的參數&#xff0c…

大語言模型推理系統綜述

摘要 近年來&#xff0c;隨著 ChatGPT 等服務推動大語言模型&#xff08;LLM&#xff09;的快速普及&#xff0c;一批專門面向 LLM 推理的系統相繼涌現&#xff0c;如 vLLM、SGLang、Mooncake 和 DeepFlow。這些系統設計工作的核心動因是 LLM 請求處理過程中所特有的自回歸特性…

用Firecrawl輕松獲取網站數據,提升AI應用的效率!

&#x1f525; Firecrawl&#xff1a;助力AI應用的強大工具&#xff01; 在數字化信息爆炸的時代&#xff0c;如何高效地從海量網頁中提取有用數據變得尤其重要。Firecrawl的問世&#xff0c;為我們揭開了一種便捷的方法來應對這一挑戰。它不僅能夠將整個網站的數據轉化為適用…

【王陽明代數講義】谷歌編程智能體Gemini CLI 使用指南、架構詳解與核心框架分析

Gemini CLI 使用指南、架構詳解與核心框架分析 Gemini CLI 使用指南、架構詳解與核心框架分析Gemini CLI 使用指南Gemini CLI 架構詳解Gemini CLI 核心框架總結 Gemini CLI 使用指南、架構詳解與核心框架分析 Gemini CLI 使用指南 1. 安裝與配置 環境要求&#xff1a; Node.…

camera調試:安卓添加xml注冊

對接安卓的平臺時&#xff0c;需要注冊對應的camera設備&#xff0c;供安卓標準api進行操作&#xff0c;rk的平臺需要在HAL層配置camera3_profiles.xml文件&#xff0c;適配驅動的信息&#xff0c;進行注冊camera設備。該xml對應的內容很多&#xff0c;很多CTS測試問題都是該文…