MongoDB 常見查詢語法與命令詳解

MongoDB 作為文檔型數據庫,其查詢語言基于 BSON(二進制 JSON)格式,與傳統關系型數據庫的 SQL 語法有較大差異。

一、基本查詢命令

1. find():查詢文檔

  • 語法db.collection.find(查詢條件, 投影)
  • 示例
    // 查詢users集合中所有文檔
    db.users.find()// 查詢年齡大于25歲的用戶,只返回姓名和年齡
    db.users.find({ age: { $gt: 25 } }, { name: 1, age: 1 })
    

2. findOne():查詢單個文檔

  • 語法db.collection.findOne(查詢條件, 投影)
  • 示例
    // 查詢ID為1001的用戶
    db.users.findOne({ id: 1001 })
    

3. countDocuments():統計文檔數量

  • 語法db.collection.countDocuments(查詢條件)
  • 示例
    // 統計年齡大于30歲的用戶數量
    db.users.countDocuments({ age: { $gt: 30 } })
    

二、查詢條件操作符

1. 比較操作符

操作符含義示例
$eq等于{ age: { $eq: 30 } }
$gt大于{ age: { $gt: 30 } }
$lt小于{ age: { $lt: 30 } }
$gte大于等于{ age: { $gte: 30 } }
$lte小于等于{ age: { $lte: 30 } }
$ne不等于{ age: { $ne: 30 } }
$in包含于數組{ age: { $in: [25, 30, 35] } }
$nin不包含于數組{ age: { $nin: [25, 30, 35] } }

2. 邏輯操作符

  • $and:多條件同時滿足
    db.users.find({ $and: [{ age: { $gt: 25 } }, { gender: "male" }] })
    
  • $or:多條件滿足其一
    db.users.find({ $or: [{ age: { $gt: 40 } }, { profession: "engineer" }] })
    
  • $not:取反條件
    db.users.find({ age: { $not: { $gt: 30 } } })  // 年齡≤30
    

3. 文本與正則操作符

  • $regex:正則匹配
    db.users.find({ name: { $regex: "^John" } })  // 姓名以John開頭
    
  • $text:全文搜索(需先創建文本索引)
    db.users.find({ $text: { $search: "John" } })
    

三、查詢結果處理

1. 排序:sort()

  • 語法db.collection.find().sort({ 字段: 1/-1 })
  • 示例
    // 按年齡升序排列
    db.users.find().sort({ age: 1 })// 按年齡降序、姓名升序排列
    db.users.find().sort({ age: -1, name: 1 })
    

2. 限制結果:limit()

  • 語法db.collection.find().limit(數量)
  • 示例
    // 只返回前10條記錄
    db.users.find().limit(10)
    

3. 跳過結果:skip()

  • 語法db.collection.find().skip(數量)
  • 示例
    // 跳過前5條,返回接下來的10條(分頁查詢)
    db.users.find().skip(5).limit(10)
    

四、聚合查詢:aggregate()

聚合操作通過管道(Pipeline)處理文檔,常用階段包括:

1. $match:過濾文檔

db.sales.aggregate([{ $match: { amount: { $gt: 1000 } } }  // 篩選金額>1000的記錄
])

2. $group:分組統計

db.sales.aggregate([{ $group: {_id: "$category",  // 按類別分組totalAmount: { $sum: "$amount" },  // 計算每組總金額count: { $sum: 1 }  // 計算每組文檔數}}
])

3. $project:投影字段

db.sales.aggregate([{ $project: {category: 1,amount: 1,isBigOrder: { $gt: ["$amount", 5000] }  // 新增字段標識大額訂單}}
])

4. $sort/$limit/$skip:同查詢結果處理

db.sales.aggregate([{ $sort: { amount: -1 } },  // 按金額降序{ $limit: 10 }  // 取前10條
])

五、索引管理命令

1. 創建索引

  • 單字段索引
    db.users.createIndex({ age: 1 })  // 升序索引
    db.users.createIndex({ name: -1 })  // 降序索引
    
  • 復合索引
    db.sales.createIndex({ category: 1, amount: -1 })
    
  • 唯一索引
    db.users.createIndex({ email: 1 }, { unique: true })
    

2. 查看索引

db.users.getIndexes()

3. 刪除索引

db.users.dropIndex("age_1")  // 刪除指定索引
db.users.dropIndexes()  // 刪除所有索引

六、高級查詢技巧

1. 數組查詢

  • 匹配數組中的元素:
    db.users.find({ hobbies: "reading" })  // 包含reading的用戶
    
  • 匹配數組中滿足條件的元素:
    db.users.find({ "scores.math": { $gt: 80 } })  // 數學成績>80
    
  • 數組大小匹配:
    db.users.find({ hobbies: { $size: 3 } })  // 恰好有3個愛好
    

2. 嵌套文檔查詢

db.users.find({ "address.city": "Beijing" })  // 地址在北京市的用戶

七、查詢優化命令

1. 解釋查詢計劃

db.users.find({ age: { $gt: 30 } }).explain("executionStats")

2. 統計索引使用情況

db.users.totalIndexSize()  // 查看索引總大小
db.runCommand({ indexStats: "users" })  // 查看詳細索引統計

八、SQL 與 MongoDB 查詢語法對比

SQL 語法MongoDB 語法
SELECT * FROM usersdb.users.find()
SELECT * FROM users WHERE age > 25db.users.find({ age: { $gt: 25 } })
SELECT * FROM users ORDER BY age DESC LIMIT 10db.users.find().sort({ age: -1 }).limit(10)
SELECT category, SUM(amount) FROM sales GROUP BY categorydb.sales.aggregate([{ $group: { _id: "$category", total: { $sum: "$amount" } }]

通過以上常用查詢命令,可滿足 MongoDB 中絕大多數查詢需求。實際應用中,建議結合索引優化和查詢計劃分析,以提升大數據量下的查詢性能。

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

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

相關文章

AlpineLinux安裝docker

或許你在docker中使用 Alpine Linux 的鏡像使用得多,但是有沒有想過在 Alpine Linux 上安裝 Docker 來使用呢?默認情況下,Docker 包位于社區倉庫中,因此在使用包管理來安裝docker之前建議更換為國內源,并開啟社區倉庫的鏈接。 下面的操作是在root用戶下運行的,如果要使用…

docker安裝gitlab并配置ssl證書

本篇安裝環境 Docker版本:Docker version 28.3.0 域名:test.disallow.cn 自簽證書:/etc/gitlab/ssl(已經存放在該目錄) 一、拉取鏡像 docker run -itd \--privilegedtrue \--hostname gitlab.test.disallow.cn \--p…

Java開發者轉型AI時代的路徑

Java開發者轉型AI時代的路徑 引言 隨著人工智能技術的飛速發展,AI已不再是遙不可及的未來,而是深刻影響著各行各業的當下。對于Java開發者而言,面對AI浪潮,如何順勢而為,實現職業轉型與技能升級,成為擺在…

QT6 源(140)模型視圖架構里的視圖總基類 QAbstractItemView:

(1)先給出本類的繼承關系 : (2)Qt 已經預先為視圖定義了鍵盤功能,Qt 大師們通過編程,已經完善了視圖對鍵盤的響應操作 : (3)因為本類是抽象基類,無…

vue上傳各種文件,并預覽組件,(預覽,下載),下載resources目錄下文件

前端組件vue 最終效果 <template><div ><div class"file-list" v-if"existingFiles.length > 0"><div class"file-card" v-for"(file, index) in existingFiles" :key"file.id"><div clas…

【CS創世SD NAND征文】SD NAND賦能新一代兒童智能玩具

基于全志F1C100S的高可靠存儲方案 文章目錄 基于全志F1C100S的高可靠存儲方案[toc]前言 一、應用產品介紹&#xff1a;兒童智能玩具的需求演變二、技術方案介紹&#xff1a;構建智能玩具的"大腦"與"記憶庫"三、核心技術模塊分析3.1 主控芯片&#xff1a;全…

mac觸摸板設置右鍵

在 Mac 筆記本上&#xff0c;觸摸板默認沒有物理左右鍵分區&#xff0c;但可以通過以下方式實現“右鍵”功能&#xff08;稱為 輔助點按&#xff09;&#xff1a; 一、啟用與使用右鍵&#xff08;輔助點按&#xff09; 步驟1&#xff1a;檢查系統設置 點擊屏幕左上角 &#x…

穩定幣發行量創紀錄地超過 Visa 交易量

穩定幣發行量創紀錄地超過 Visa 交易量 穩定幣的崛起正在重塑全球金融格局&#xff0c;華夏基金首席執行官甘天&#xff08;Gan Tian&#xff09;強調了穩定幣的快速增長&#xff0c;并指出穩定幣的交易量在短短五年內就超過了Visa 40年的交易量。這凸顯了貨幣使用的轉變。 穩…

編程 IDE 混戰簡史:從 Copilot 到 Claude Code,一場重塑開發方式的戰爭

unsetunset引言&#xff1a;開發新紀元的序幕unsetunset 編程世界&#xff0c;從最初依賴打孔卡和簡陋的命令行工具&#xff0c;到如今功能琳瑯滿目的集成開發環境&#xff08;IDE&#xff09;&#xff0c;每一步都見證了效率與智能的飛躍。IDE作為開發者與代碼交互的核心界面&…

軟測八股--計算機網絡

計算機網絡基礎 局域網廣域網 局域網&#xff1a;一個區域內由多臺計算機互聯成的計算機組&#xff08;學校&#xff0c;辦公室&#xff0c;公司/學校等&#xff09;。可以實現文件管理&#xff0c;應用軟件管理&#xff0c;答應及管理&#xff0c;掃描儀共享等。是封閉的&am…

某省職業院校技能大賽 高職組“信息安全管理與評估”賽項第二部分:應急響應

&#xff01;&#xff01;&#xff01;需要環境可私信博主&#xff01;&#xff01;&#xff01; &#xff01;&#xff01;&#xff01;若有錯誤歡迎指正&#xff01;:) 序號任務要求1提交攻擊者的兩個內網IP地址2提交網站管理員用戶的用戶名和密碼3提交黑客得到 mysql 服務的…

OkHttp 簡單配置

OkHttpClient 的簡單配置&#xff0c;包含重試&#xff0c;線程池 Configuration public class OkHttpConfig {Bean("deSourceOkHttp")public OkHttpClient okHttpClient() {return new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS).readTimeout(3…

群暉nas安裝moodle跳坑記錄

1&#xff0c;套件里面直接安裝 會安裝好幾個依賴&#xff0c;包括php apach &#xff0c;數據庫。這些安裝的時間就比較長。 安裝完成后自動安裝 Moodle。 過程也很長數據庫里面的表有接近500張。 2&#xff0c;安裝位置 順便提一下 nas程序的安裝位置 這兩個位置好像都不是…

鴻蒙HarmonyOS 5小游戲實踐:打磚塊游戲(附:源代碼)

打磚塊是一款經典的游戲&#xff0c;它簡單易懂卻又充滿挑戰性。本文將介紹如何使用ArkUI框架開發一個完整的打磚塊游戲&#xff0c;涵蓋游戲邏輯設計、UI實現和交互處理等核心內容。 游戲架構設計 我們的打磚塊游戲采用了組件化設計&#xff0c;主要分為兩個部分&#xff1a;…

Flutter MobX 響應式原理與實戰詳解

&#x1f4da; Flutter 狀態管理系列文章目錄 Flutter 狀態管理(setState、InheritedWidget、 Provider 、Riverpod、 BLoC / Cubit、 GetX 、MobX 、Redux) setState() 使用詳解&#xff1a;原理及注意事項 InheritedWidget 組件使用及原理 Flutter 中 Provider 的使用、注…

淺談國產數據庫多租戶方案:提升云計算與SaaS的資源管理效率

近年來&#xff0c;“數據庫多租戶”這一概念在技術圈內頻頻出現&#xff0c;成為云計算和SaaS&#xff08;軟件即服務&#xff09;架構中的重要組成部分。多租戶架構不僅為企業提供了高效的資源隔離與共享解決方案&#xff0c;還能大幅降低成本&#xff0c;提高系統的可擴展性…

Wpf的Binding

前言 wpf的Binding就像一個橋梁&#xff0c;它的作用就是連接邏輯層與界面層&#xff0c;既能夠把邏輯層的數據搬到界面層展示&#xff0c;又能將界面層的數據更改后傳遞到邏輯層&#xff0c;Binding的數據來源就是Binding的源&#xff0c;數據展示的地方就是Binding的目標。 …

嵌入式單片機中SPI串行外設接口控制與詳解

串行外設接口(Serial Peripheral Interface)的簡稱也叫做SPI,是一種高速的、全雙工同步通信的一種接口,串行外設接口一般是需要4根線來進行通信(NSS、MISO、MOSI、SCK),但是如果打算實現單向通信(最少3根線),就可以利用這種機制實現一對多或者一對一的通信。 第一:…

【世紀龍科技】新能源汽車動力電池總成裝調與檢修教學軟件

在新能源汽車產業“技術迭代快、安全要求高、實操風險大”的背景下&#xff0c;職業院校如何以“項目式教學改革”為突破口&#xff0c;破解傳統實訓“高成本、高風險、低效率”的困局&#xff1f;江蘇世紀龍科技以桌面VR沉浸式技術為支點&#xff0c;推出《新能源動力電池總成…

GO泛型編程面試題及參考答案

目錄 什么是 Go 中的泛型?Go 從哪個版本開始支持泛型? 在 Go 中如何定義一個帶類型參數的函數? 如何為結構體添加類型參數? 使用 any 關鍵字和自定義類型約束有什么區別? 泛型中~T 的語義及其實際應用是什么? 如何在函數中使用多個類型參數?舉例說明。 Go 泛型支…