mongodb數據庫的常用操作語句

說在前面的話

本文所有的操作示例,都以集合“HistoryTaskBase”為例。

一、查詢

1、時間區間

查詢“通知時間”介于2019-09-01到2019-10-01之間的數據。

db.getCollection('HistoryTaskBase').find({notifyTime:{$gte:ISODate('2019-09-01T00:00:00.000Z'),$lte:ISODate('2019-10-01T00:00:00.000Z')}})

2、統計

db.getCollection('HistoryTaskBase').find({notifyTime:{$lte:ISODate('2023-11-10T00:00:00.000Z')}}).count()// 總記錄數
39465

在這里插入圖片描述

3、分頁(skip和limit)

假設每頁查詢10條記錄,分頁查詢第二頁,語句見下:

  • skip 跳過前面多少條記錄
  • limit 限制查詢多少條記錄
db.getCollection('HistoryTaskBase').find({notifyTime:{$lte:ISODate('2023-11-10T00:00:00.000Z')}}).skip(10).limit(10)

在這里插入圖片描述

4、排序sort

  • 降序-1
db.getCollection('HistoryTaskBase').find({notifyTime:{$gte:ISODate('2019-09-01T00:00:00.000Z'),$lte:ISODate('2023-12-01T00:00:00.000Z')}}).sort({notifyTime:-1})

在這里插入圖片描述

  • 升序1
db.getCollection('HistoryTaskBase').find({notifyTime:{$gte:ISODate('2019-09-01T00:00:00.000Z'),$lte:ISODate('2023-12-01T00:00:00.000Z')}}).sort({notifyTime:-1})

在這里插入圖片描述

  • 多重排序

先按schoolId升序,再是createdOn倒序

db.getCollection('xxx').find({}).sort({schoolId: 1, createdOn:-1});

5、in集合

totalIds 是一個數組類型,在查詢包含關系的時候,使用In集合。

db.getCollection('xxx').find({"totalIds":{$in:[152290]}});

在這里插入圖片描述

6、nin不存在集合

是in的相反操作,不存在于集合里。

7、比較操作

  • $eq:等于
  • $ne:不等于
  • $lt:小于
  • $lte:小于等于
  • $gt:大于
  • $gte:大于等于
db.getCollection('xxx').find({"classroomId":{$eq:"067JOE"}});db.getCollection('xxx').find({"classroomId":{$ne:"067JOE"}});

像前文說的時間區間查詢,就是使用大于小于的比較操作實現。因為都比較簡單,就不一一舉例了。

8、存在性操作

檢查字段是否存在

db.getCollection('xxx').find({"classroomId":{$exists: true}});

9、數組查詢

  • size-查詢數組的長度等于1的記錄
db.getCollection('xxx').find({"totalIds":{$size: 1}});

在這里插入圖片描述

  • elemMatch-匹配數組中的元素

要查詢數組desktopList下的數組taskList的taskId=“2ASS229CMY”

數據結構示例:

{"_id":"5c6cfc303daedd4e40fe91f5","userId":150908,"classroomId":"ZN41B3","taskTotalNumber":5,"desktopList":[{"desktopId":"IQZ5SN2R","classId":0,"classMemNumber":0,"desktopType":0,"taskList":[{"taskId":"2ASS229CMY","taskType":1,"materialId":"ZQ9T1JCA2U"}]}]
}

mongodb查詢語句寫法見下:

db.getCollection('xxx').find({"desktopList": {"$elemMatch": {"taskList": {"$elemMatch": {"taskId": "2ASS229CMY"}}}}
});

10、邏輯查詢

  • $and
    默認,多個條件的查詢就是and了。
    它的語法格式是:{ $and: [ { }, { }, … , { } ] }

示例:

查詢userId=152408且schoolId=684的記錄

db.getCollection('ClassroomBase').find({ $and: [ {  "userId" : 152408 }, { "schoolId": 684 } ] } );// 等同于下面的語句
db.getCollection('ClassroomBase').find({  "userId" : 152408 ,  "schoolId": 684  } );
  • $or
    語法格式是:{ $or: [ { }, { }, … , { } ] }
    示例見下:

查詢userId=152408或schoolId=684的記錄

db.getCollection('ClassroomBase').find({ $or: [ {  "userId" : 152408 }, { "schoolId": 684 } ] } );
  • $nor
    語法格式是:{ $nor: [ { }, { }, … { } ] },它是or的取反。
    繼續上面的示例,就變成了要查詢userId != 152408 且 schoolId != 684的記錄
db.getCollection('ClassroomBase').find({ $nor: [ {  "userId" : 152408 }, { "schoolId": 684 } ] } );
  • $not

需要注意的是,它會查詢出不包含該字段的文檔。

語法各是:{ field: { $not: { } } },邏輯運算中,簡單的取反。一般是針對單條件而言。
比如,查詢語句見下:

db.getCollection('xxx').find({ schoolId: { $not: { $gt: 1000 } } });

它將查詢出schoolId 不大于1000的記錄,也會把schoolId為空的記錄查詢出來。

二、刪除

1、deleteMany-批量刪除

推薦使用這個,匹配到多少就刪除多少條記錄。

db.getCollection('HistoryTaskBase').deleteMany({notifyTime:{$gte:ISODate('2019-09-01T00:00:00.000Z'),$lte:ISODate('2019-10-01T00:00:00.000Z')}})// 返回
{"acknowledged" : true,"deletedCount" : 3693.0
}

在這里插入圖片描述

2、deleteOne-刪除單條記錄

db.getCollection('xxx').deleteOne({"_id":"5c6cfc303daedd4e40fe91f4", "isDelete": true});// 返回
{"acknowledged" : true,"deletedCount" : 0.0
}

3、findOneAndDelete-刪除并返回刪除前的文檔

與上一個操作語句不同,會返回刪除前的文檔。相同的是:都會刪除該記錄。

db.getCollection('xxx').findOneAndDelete({"classroomId":"ZN41B3"});

在這里插入圖片描述
再次查詢,則返回0條記錄:
在這里插入圖片描述

三、聚合操作

  • $match: 過濾文檔,只保留滿足指定條件的文檔
  • $group: 對文檔進行分組操作

示例一:聚合查詢最近幾天(2023-11-20到2023-11-23)創建的課堂,按天求和,算出每一天的總人數。

  • createdOn 創建時間
  • $dayOfYear 操作符從 createdOn 中提取出一年中的第幾天,并以此為基準進行分組
  • $addToSet 操作符用于將符合條件的 totalIds 字段的值添加到一個集合中。

這意味著對于每個分組(每天的文檔),都會創建一個包含唯一 totalIds 值的集合。

db.getCollection('xxx').aggregate([{ $match : { createdOn:{$gte:ISODate('2023-11-20T00:00:00.000Z'),$lte:ISODate('2023-11-24T00:00:00.000Z')},isDelete:false } },{$group: {_id: {  day: { $dayOfYear: "$createdOn" } },userIds : {$addToSet : "$totalIds"}}
}
])

返回值
在這里插入圖片描述

示例二:聚合查詢最近幾天(2023-11-20到2023-11-23)創建的課堂數,按天分組。

db.getCollection('xxx').aggregate([{ $match : { createdOn:{$gte:ISODate('2023-11-20T00:00:00.000Z'),$lte:ISODate('2023-11-24T00:00:00.000Z')},isDelete:false } },{$group: {_id: {  day: { $dayOfYear: "$createdOn" } },total: { $sum: 1 }}
}
])

// 聚合結果
在這里插入圖片描述

其他聚合

除了$sum外,還有最大、最小和平均等常用的函數。

{$group: {_id: "$field",total: { $sum: 1 },average: { $avg: "$numericField" },max: { $max: "$numericField" },min: { $min: "$numericField" }}
}

$lookup

本示例是查詢訂單,然后外關聯商品表,主外鍵是productId。

db.orders.aggregate([{$lookup: {from: "products",localField: "productId",foreignField: "_id",as: "product"}},{$unwind: "$product" // 展開 product 數組}
]);
  • orders數據示例
{"_id": 1,"orderNumber": "NO123","productId": 101,"quantity": 2
}
  • products數據示例
{"_id": 101,"productName": "商品名稱","price": 1000
}
  • 查詢結果見下,通過$unwind,將匹配到的商品文檔變為單獨的文檔。
{"_id": 1,"orderNumber": "NO123","productId": 101,"quantity": 2,"product": {"_id": 101,"productName": "商品名稱","price": 1000}
}

四、函數

在 MongoDB 的 shell 環境中,你可以使用 JavaScript 來編寫條件語句。這里只列舉幾個作為示例。

1、foreach

多個集合的嵌套循環查詢

  • 先查詢ClassroomBase,得到其classroomId
  • 再傳遞給Desktop,作為查詢條件進行查詢
  • 遍歷結果,對數組taskList的長度進行累加
// 查詢各個課堂的人數和任務數
db.xxx.find({"isDelete": false}).forEach(function (doc) {// 任務數var taskSize = 0;// 嵌套查詢db.Desktop.find({"classroomId": doc.classroomId}, {"desktopList": 1}).forEach(function(doc){doc.desktopList.forEach(function(task) {taskSize += task.taskList.length})});print("老師ID:" + doc.userId + " 課堂ID:" + doc.classroomId + " 人數:" + doc.totalIds.length + " 任務數: " + taskSize)

2、print

輸出查詢結果

3、push

查詢2022-12-25這一天上課的課堂ID列表

var classroomIds = new Array();
db.xxx.find({startTime:{$gte:ISODate('2022-12-25T00:00:00.000Z'),$lte:ISODate('2022-12-26T00:00:00.000Z')},isDelete:false}).forEach(function (doc) {classroomIds.push(doc.classroomId);})// 輸出課堂ID數組
print(classroomIds.length);

4、if

var x = 10;if (x > 5) {print("x 大于 5");
} else if (x === 5) {print("x 等于 5");
} else {print("x 小于 5");
}

5、switch

var day = "Monday";switch (day) {case "Monday":print("星期一");break;case "Tuesday":print("星期二");break;// 其他 case 語句default:print("其他天");
}

6、三目運算

var age = 20;
var message = (age >= 18) ? "成年人" : "未成年人";
print(message);

五、總結

mongodb還有一些運維,比如定期備份、集群管理等,有空再整理。

mongodb的修改操作,也未在本文涉及。

本文側重于mongodb的查詢,說實話,查詢才是最復雜的。

希望可以幫助到你,有空我再更新~~

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

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

相關文章

基于STM32的電影院安全系統的設計與實現(論文+源碼)

1.系統設計 本次基于STM32F4的電影院安全系統的設計與實現,以STM32F4單片機為核心控制器,配合人體紅外傳感器,煙霧傳感器,甲醛傳感器等硬件設施,實現了對電影院內環境的檢測,當出現異常則會通過蜂鳴器和LE…

實現了一個簡易的計算器

計算器的界面如下: 實現過程: 通過html和css編寫這樣一個界面JavaScript實現功能 在通過JavaScript實現計算器功能的過程中,其實使用的都是一些基本指數。主要包括以下幾點: If/else 分支.For 循環JavaScript 函數箭頭函數&…

日志分析對決:揭示 ELK 與 GrayLog 的優勢和差異

🎏:你只管努力,剩下的交給時間 🏠 :小破站 日志分析對決:揭示 ELK 與 GrayLog 的優勢和差異 前言第一:ELK Stack簡介第二:GrayLog簡介架構:主要特性: 第三&am…

騰訊待辦關停,怎么在手機上記錄待辦清單并設置提醒?

如果你之前一直在騰訊待辦這款微信小程序中記錄待辦事項,那么你就會發現小程序中彈窗的“業務關停通知”彈窗,查看其中的內容可知,由于業務方向調整,騰訊待辦將于2023年12月20日全面停止運營并下架,這就意味著我們無法…

面試:MyBatis問題

文章目錄 什么是MyBatis?MyBatis的核心組件有哪些?能說說MyBatis的工作原理嗎?MyBatis的工作流程是怎樣的?Mybaits 的優點 & 缺點MyBatis 與 JPA 有哪些不同?MyBatis一二級緩存的區別?MyBatis如何處理延遲加載&am…

【一文搞定】在Docker中搭建centos7遠程桌面環境(Xfce、Gnome兩種方式)

目錄 前言一、基于GNOME構建遠程桌面二、基于Xfce構建遠程桌面(輕量級) 前言 本文提供兩種安裝方式,均自己測試過,最后還是選擇了Xfce,因為它比較輕量級,占用資源較少。大家也可以都試試,比較感…

外地人可以在上海當老師嗎

隨著社會的發展,越來越多的人涌入大城市,其中也包括上海。在這個繁華的城市里,許多人都夢想成為一名老師,但是外地人可以在上海當老師嗎? 首先需要了解上海的教育政策。根據相關規定,外地人可以在上海當老師…

角色管理--產品角色負責人

研發組織管理--角色管理--產品角色負責人 定位 作為管理者,建設,管理,優化一個可控可自驅的產品經理團隊,并保持對應業務領域的產品競爭力,在保證業界平均水平的基礎上,不斷嘗試創新,爭做行業…

C#實現圖片背景色透明(親測有效)

重要代碼: Bitmap bm new Bitmap(origin); bm.MakeTransparent(); string Name_ "C:\\Users\\xx\\Downloads\\download\\" DateTime.Now.Ticks.ToString() ".ico";Size size new Size(256, 64);ConvertImageToIcon("C:…

視頻網關簡介

在數字化時代,視頻通信已經成為了人們日常生活和工作中的重要部分。為了滿足不同設備和平臺之間的視頻通信需求,各種視頻協議應運而生。然而,這些協議之間的差異使得相互通信變得復雜。因此,視頻網關作為一種重要的網絡設備&#…

Oracle中文顯示???????解決辦法

項目場景: Oracleoracle中文顯示???解決辦法 問題描述 原因分析: Oracle中文顯示???通常是由于字符集不匹配或者編碼問題導致的。當數據庫中的數據使用的是某種字符集,而客戶端或者應用程序使用的是另一種字符集時,就會出…

解決Android端libc++_shared.so庫沖突問題

前言 隨著App功能增多,集成的so庫也會增多,如果系統中多個so庫都使用系統自動生成的libc_shared.so庫,如果多個SDK都有該so包,就會出現報錯: 解決辦法 如果出現該問題,說明您的項目中有多個SDK共同依賴了C標…

fastjson2解析多為小數報錯 TODO問題

解決方式:使用谷歌的gson可以解析多為小數

Java常見的bug

Java是一種強類型、面向對象的編程語言,有一些常見的bug或錯誤類型,盡管具體的bug會因項目和代碼的不同而有所差異。以下是一些Java開發中常見的bug類型: 空指針異常(NullPointerException): 嘗試在一個空對象上調用方法或訪問屬性時會引發空指針異常。這通常發生在沒有對…

【雙指針】有效三角形的個數

有效三角形的個數 611. 有效三角形的個數 - 力扣(LeetCode) 題目描述 給定一個包含非負整數的數組 nums ,返回其中可以組成三角形三條邊的三元組個數。 示例 1: 輸入: nums [2,2,3,4] 輸出: 3 解釋:有效的組合是: 2,3,4 (使用第一個 2…

MIME 類型

MIME 類型 MIME (Multipurpose Internet Mail Extensions) 是描述消息內容類型的標準,用來表示文檔、文件或字節流的性質和格式。 MIME 消息能包含文本、圖像、音頻、視頻以及其他應用程序專用的數據。 瀏覽器通常使用 MIME 類型(而不是文件擴展名&am…

如何編寫一份優質的測試用例?

前言 這篇文章主要是想要寫給測試小伙伴們的,因為我發現還是有很多小伙伴在遇到寫測試用例的時候無從下手,我就想和大家簡單的聊聊,分享一下我的一些見解和經驗。 用例的五個構成元素: 用例標題前置條件測試步驟期望結果后置條…

05 Powershell發送http請求

一:發送http請求 1、語法: Invoke-WebRequest -uri "請求地址" -UseBasicParsing 2、實例: $result Invoke-WebRequest -uri "http://rdc.mingyuanyun.com/rdc-service/api/v2/apps/$($app)/versions/maxpackversion"…

騰訊又出王炸產品!使用混元大模型進行數據報表測試

最近騰訊出了自己的大模型,命名混元。 現在已經開始內測,感謝騰訊小伙伴盧曉明同學幫我們提前申請到了內測機會,接下來我們用騰訊混元大模型與實際工作結合,開始我的報表測試之旅。 騰訊混元大模型官方入口:https://hunyuan.ten…

Java 基礎面試題大概有哪些?

Java基礎面試題的范圍非常廣泛,一般包括以下幾個方面: 一、Java基礎語法 數據類型:Java中包括基本數據類型和引用數據類型,基本數據類型包括byte、short、int、long、float、double、char、boolean,引用數據類型包括…