MongoDB:簡單的增刪改查操作

一.概述

? ? ? ? 本篇文章介紹在Navicat中對MongoDB數據庫進行增刪改查操作,在后面會介紹在Spring Boot中使用MongoTemplate對MongoDB數據庫進行相關操作.如有必要可以先看看前面幾篇文章.

MongoDB:MySQL,Redis,ES,MongoDB的應用場景

MongoDB:數據庫初步應用

二.在Navicat進行增刪改查操作

2.1 新增數據

MongoDB有以下幾種方法對數據進行新增.

1) insert() 插入單個或者多個數據(文檔);

2) save() 如果新新增數據主鍵存在那么就修改,如果不存在就新增.

3) insertOne()新增一條數據

4) insertMany()新增多條數據.

其中insertOne,insertMany與insert()的功能重復,所以這里就不多做介紹了.

2.1.1 insert()新增數據

示例代碼如下:

db.user_search_record.insert({uuid:"c5e41a77a87c776c7cdbe521294ddcf6",keyword:"剪紙用品",time:ISODate(),userId:"0f6bea039ca64c9e81c7bdb43f1587ca"}
)

對照語法格式如下:

db.集合名稱.insert(JSON格式的鍵值對
)

這里需要主要的是db不能省略,不然會提示集合(表)名稱未定義.

在上面案例中ISODate()獲得的是格林威治時間,需要在上面+8才能獲得北京時間,時間格式時候yyyy-MM-dd HH:mm:ss?

下面代碼添加多條記錄,多條記錄需要用 [ ] 符號,表示是一個數組.

db.user_search_record.insert([
{uuid:"c5e41a77a87c776c7cdbe521294ddcf6",keyword:"日用商品",time:ISODate(),userId:"0f6bea039ca64c9e81c7bdb43f1587ca"},
{uuid:"c5e41a77a87c776c7cdbe521294ddcf6",keyword:"食品",time:ISODate(),userId:"0f6bea039ca64c9e81c7bdb43f1587ca"},
])

在MongoDB的集合中存在_id字段,作為文檔的主鍵,如果沒有指定,會自動生成.?

2.1.2 使用save()保存文檔

save()的語法格式與insert()格式類似,示例代碼如下:

db.user_search_record.save({uuid:"c5e41a77a87c776c7cdbe521294ddcf6",keyword:"現切水果",time:ISODate(),userId:"0f6bea039ca64c9e81c7bdb43f1587ca"}
)

上面代碼沒有指定_id所以等同于insert(),將新增一條代碼.如果我們指定_id,將判斷_id是否存在,如果存在那么就修改原數據,如果不存在,那么新增,示例代碼如下:

db.user_search_record.save({_id:ObjectId("64dc2cc9045b0000260056f5"),uuid:"c5e41a77a87c776c7cdbe521294ddcf6",keyword:"綠葉水果",time:ISODate(),userId:"0f6bea039ca64c9e81c7bdb43f1587ca"}
)

?在上面代碼中需要注意_id是MongoDB特有的數據類型:ObjectId,所以需要用到ObjectId()這個方法對字符串進行轉換,并且不能省略.如果上面的_id存在將對數據進行修改,如果不存在那么將新增.

?與insert()不同的是save()一次只能操作一條數據.

2.2 更新數據

? ? ? ? 更新數據常見的方法有update(),save(),updateOne(),updateMany(),replaceOne().其中save在上面已經介紹了,

2.2.1?update()更新數據

下面代碼使用update方法更新數據

db.product_detail.update(
{_id:ObjectId("64db394fd5b10c163f4ce01d")},
{$set:{title:"正宗山東煙臺紅富士又紅又甜 順豐包郵"}}
)

其語法格式如下:

db.product_detail.update(
{查詢條件},
{$set:更新字段}
)

在上面的更新中,默認只會更新匹配到的第一條語句,如果需要更新所有匹配到的語句需要設置multi為true,這個值默認為false(不進行多條語句更新),示例如下面的代碼將更新多條匹配的語句:

db.product_detail.update(
{title:"享受正宗的新疆李子美味"},
{$set:{title:"正宗的新疆李子順豐包郵到家 皮薄美味豐富維C"}},
{multi:true}
)

2.2.2 其它更新語法介紹

? ? ? ? ?其它更新語法不常用,只做簡單介紹,updateOne()只更新匹配到的第一條語句,updateMany()更新多條語句,reaplaceOne()只更新匹配到的第一條語句.

2.3 刪除數據

? ? ? ? MongoDB中刪除也有多種方法:remove(),deleteOne(),deleteMany(),最常用的是remove()方法.

2.3.1 remove()方法刪除數據

remove的語法與update語法有相似之處,示例代碼如下:

db.user_search_record.remove(
{_id:ObjectId("64db3bf7d5b10c163f5469d5")}, 
{justOne:true}
)

其語法格式如下:

db.集合名稱.remove(
{篩選條件}, 
{可選參數}
)

在上面的代碼中justOne:true表示只刪除一條數據,這個值默認為false,也就是會刪除所有匹配到的數據.在做刪除之前最好先根據刪除條件做一次查詢,避免被誤刪.

2.3.3 其它刪除方法

?deleteOne()一次刪除一個文檔

?deleteMany()一次刪除多條匹配到的文檔.

上面這兩個方法都可以用remove()代替.

2.4 基本查詢

任何數據庫中查詢是所有操作中最重要和常用的環節,我們需要從以下幾個方面逐步了解

2.4.1 比較操作符

在前面的操作中,我們已經發現了mongoDB以$作為關鍵字的標志,這查詢中也是一樣.

$eq : 查詢相等

$ne: 查詢不相等

$gt, $gte: 查詢大于,大于等于條件的文檔

$lt, $lte : 查詢小于, 小于等于條件的文檔

$in, $nin: 查詢條件必須是數組, 查詢存在或者不存在這個數組里面值的文檔.

2.4.2 邏輯操作符

$and : 用于多條件查詢,表示并且

$or : 用于多條件查詢,表示或

$nor : 用于多條件查詢,表示查詢文檔必須不符合所有條件

$not : 只能用于一個條件查詢,表示文檔不符合查詢條件.

2.4.3 元素操作符

$exists: 判斷指定字段是否存在.

$type: 判斷指定字段的數據類型

使用find()方法進行查詢,案例如下:

db.product_detail.find({$and:[ 	//and中列出了三個條件必須都要滿足{categoryId:{$eq:32}}, {productRating:{$gte:4.9}}, {shopId:{$not:{$eq:"4d3f317917543ab3c1ebed6300453f69"}}}],$or:[		//or列出了兩個條件,必須滿足其中一個{positiveReviews:{$gte:300}}, {badReviews:{$lt:10}}]}
)

find方法接受一個json數據,其中$and和$or作為數據中的兩個屬性,這兩個屬性可以接受數組作為屬性值.?

2.4.4 模糊查詢

在mongoDB中,模糊查詢是采用的正則表達式的方式,例如下面的代碼:

db.product_detail.find({$and:[{address:"深圳"},{productRating:{$gte:4.5}},{title:{$regex:"西瓜",$options:["i","x","s"]} }]}
)

$regex:"西 瓜" 是指定title字段需要模糊匹配西瓜這兩個字.

$options:是設置可選參數, i表示忽略大小寫,x表示忽略空格,s表示忽略換行.

三.Spring Boot 對MongoDB進行增刪改查

先引用mongoTemplate

@Resource
private MongoTemplate mongoTemplate;    //mongoDB操作模板

3.1 新增文檔

/*** 添加用戶的收貨地址* @param userAddress* @return 返回主鍵*/@Overridepublic String addAddress(UserAddress userAddress){//向集合中添加數據,如果沒有指定_id,那么會自動生成userAddress = mongoTemplate.insert(userAddress);//返回生成的uidreturn userAddress.get_id();}

3.2 更新文檔

/*** 更新用戶的收貨地址* @param userAddress* @return*/@Overridepublic boolean updateAddress(UserAddress userAddress){//創建查詢對象Query query = new Query();//根據主鍵創建查詢語句query.addCriteria(Criteria.where("_id").is(userAddress.get_id()));//創建更新對象Update update = new Update();//根據鍵值對添加更新數據update.set("address",userAddress.getAddress());update.set("province",userAddress.getProvince());update.set("tel",userAddress.getTel());update.set("city",userAddress.getCity());update.set("recipient",userAddress.getRecipient());update.set("isDefault",userAddress.getIsDefault());//將檢索出來的對象進行更新UpdateResult result =  mongoTemplate.updateFirst(query,update,UserAddress.class);//判斷被修改的文檔數據量if(result.getModifiedCount()>0){return true;}else{return false;}}

3.3 刪除文檔

/*** 根據主鍵編號移除用戶的收貨地址:實際操作為將用戶的收貨地址的isDelete值改為true(1)* @param id* @return true:成功*/@Overridepublic boolean removeAddress(String id){//創建查詢標準Query query = new Query();query.addCriteria(Criteria.where("_id").is(id));//將數據的isDeleted字段改為trueUpdate update = new Update();update.set("isDeleted",Byte.valueOf("1"));UpdateResult result = mongoTemplate.updateFirst(query,update,UserAddress.class);if(result.getModifiedCount()>0){return true;}else{return false;}}

3.4 查詢文檔

/*** 根據用戶id查詢這個用戶的所有收貨地址* @param uid 用戶id* @return 收貨地址集合*/@Overridepublic List<UserAddress> getAddressByUserId(String uid) {//創建查詢對象Query query = new Query();//配置查詢標準query.addCriteria(Criteria.where("userId").is(uid));List<UserAddress> list = mongoTemplate.find(query,UserAddress.class);return list;}/*** 根據主鍵編號查詢收貨地址* @param id* @return*/@Overridepublic UserAddress getAddressById(String id){//創建查詢標準Query query = new Query();query.addCriteria(Criteria.where("_id").is(id));//根據主鍵查詢值需要返回一個對象UserAddress userAddress = mongoTemplate.findOne(query,UserAddress.class);return userAddress;}

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

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

相關文章

linux系統服務學習(七)NFS服務、DHCP服務

文章目錄 一、NFS服務概述1、任務背景2、環境準備3、NFS概述4、NFS組成5、與NFS相關的軟件包6、安裝NFS軟件7、NFS的配置文件 二、NFS實驗1、搭建NFS服務器2、編寫NFS主配置文件3、啟動相關的NFS服務4、搭建Web服務器5、在Web服務器中掛載NFS6、上傳aws.mp4視頻到NFS服務器的/s…

人工智能學習框架—飛槳Paddle人工智能

1.人工智能框架 機器學習的三要素&#xff1a;模型、學習策略、優化算法。 當我們用機器學習來解決一些模式識別任務時&#xff0c;一般的流程包含以下幾個步驟&#xff1a; 1.1.淺層學習和深度學習 淺層學習(Shallow Learning)&#xff1a;不涉及特征學習&#xff0c;其特征…

Vue3 setup中使用$refs

在 Vue 3 中的 Composition API 中&#xff0c;$refs 并不直接可用于 setup 函數。這是因為 $refs 是 Vue 2 的實例屬性&#xff0c;而在 Vue 3 中&#xff0c;setup 函數是與模板實例分離的&#xff0c;不再使用實例屬性。 實際工作中確實有需求&#xff0c;在setup 函數使用…

迪瑞克斯拉算法

迪銳克斯拉算法 簡單來說就是在有向圖中&#xff0c;給定一個圖中具體的出發點&#xff0c;從這個點出發能夠到達的所有的點&#xff0c;每個點的最短距離是多少。到不了的點&#xff0c;距離則是正無窮。有向&#xff0c;無負權重&#xff0c;可以有環。 所以說&#xff0c;迪…

流媒體服務-傳輸延時(SEI插幀)

什么是延時 很多小伙伴認為&#xff0c;當推流端和拉流端顯示的時間不一致&#xff0c;即為延時。 其實這種看法是比較片面的&#xff0c;不同的播放器&#xff0c;對同一路流進行測試&#xff0c;可能會得到不同的結果。 一般來說&#xff0c;延時為以下幾個部分的累加組成 …

【Android】解決Lint found fatal errors while assembling a release target

報錯信息&#xff1a; Android在debug模式下打包沒有問題&#xff0c;但是在打包release版本時出現一下問題&#xff1a; 結果圖 原因 我項目的原因是因為把正式、測試地址放到代碼里了&#xff0c;忘記選中正式環境的地址&#xff0c;導致打正式包有問題&#xff1b;大家如果…

Shell編程學習之變量的使用

查看當前系統使用的命令解釋器&#xff1a; linuxubuntu:~$ echo $SHELL /bin/bashshell命令&#xff1a;在終端上使用的命令&#xff0c;例如 vi a.cgcc a.c./a.outshell腳本&#xff1a;其是一個.sh文件&#xff0c;里面都是命令的集合&#xff0c;以及一些復雜的邏輯&#…

RuntimeException詳解

當我們談論Java編程中的異常處理時&#xff0c;RuntimeException是一個關鍵的概念&#xff0c;它在代碼開發和維護中扮演著重要的角色。本文將深入探討RuntimeException&#xff0c;了解它的特點、使用場景以及如何在代碼中處理它。 什么是RuntimeException&#xff1f; 在Ja…

復合 類型

字符串和切片 切片 切片的作用是允許你引用集合中部分連續的元素序列&#xff0c;而不是引用整個集合。 例如&#xff1a; let s String::from("hello world");let hello &s[0..5]; // 切片 [0,5) 等效于&s[..5] let world &s[6..11]; // 切片…

線性動態規劃入門之挖地雷

P2196 [NOIP1996 提高組] 挖地雷 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 這個題有點坑&#xff0c;就是說你只能往下挖&#xff0c;可以理解成單項路徑。比如1與3之間是1代表1可以到3而3不可以到1。所以我們來思考dp把。怎么寫&#xff1f;我們這么想假設1與2&#xf…

gitee上傳一個本地項目到一個空倉庫

gitee上傳一個本地項目到一個空倉庫 引入 比如&#xff0c;你現在本地下載了一個半成品的框架&#xff0c;現在想要把這個本地項目放到gitee的倉庫上&#xff0c;這時就需要我們來做到把這個本地項目上傳到gitee上了。 具體步驟 1. 登錄碼云 地址&#xff1a;https://gite…

【Pytroch】基于支持向量機算法的數據分類預測(Excel可直接替換數據)

【Pytroch】基于支持向量機算法的數據分類預測(Excel可直接替換數據) 1.模型原理2.數學公式3.文件結構4.Excel數據5.下載地址6.完整代碼7.運行結果1.模型原理 支持向量機(Support Vector Machine,SVM)是一種強大的監督學習算法,用于二分類和多分類問題。它的主要思想是找…

【數據結構】樹和二叉樹的概念及結構

1.樹概念及結構 1.1樹的概念 樹是一種非線性的數據結構&#xff0c;它是由n&#xff08;n>0&#xff09;個有限結點組成一個具有層次關系的集合。把它叫做樹是因為它看起來像一棵倒掛的樹&#xff0c;也就是說它是根朝上&#xff0c;而葉朝下的。 有一個特殊的結點&#…

Spring Boot 中的 AOP,到底是 JDK 動態代理還是 Cglib 動態代理

大家都知道&#xff0c;AOP 底層是動態代理&#xff0c;而 Java 中的動態代理有兩種實現方式&#xff1a; 基于 JDK 的動態代理 基于 Cglib 的動態代理 這兩者最大的區別在于基于 JDK 的動態代理需要被代理的對象有接口&#xff0c;而基于 Cglib 的動態代理并不需要被代理對…

list

目錄 迭代器 介紹 種類 本質 介紹 模擬實現 注意點 代碼 迭代器 介紹 在C中&#xff0c;迭代器&#xff08;Iterators&#xff09;是一種用于遍歷容器&#xff08;如數組、vector、list等&#xff09;中元素的工具 無論容器的具體實現細節如何,訪問容器中的元素的方…

在ubuntu中將dict.txt導入到數據庫sqlite3

將dict.txt導入到數據庫 #include <head.h> #include <sqlite3.h> int do_insert(int i,char *str,sqlite3 *db); int main(int argc, const char *argv[]) {//創建泵打開一個數據庫sqlite3 *db NULL;if(sqlite3_open("./my.db",&db) ! SQLITE_OK){…

【TI-CCS筆記】工程編譯配置 bin文件的編譯和生成 各種架構的Post-build配置匯總

【TI-CCS筆記】工程編譯配置 bin文件的編譯和生成 各種架構的Post-build配置匯總 TI編譯器分類 在CCS按照目錄下 有個名為${CG_TOOL_ROOT}的目錄 其下就是當前工程的編譯器 存放目錄為&#xff1a; C:\ti\ccs1240\ccs\tools\compiler按類型分為五種&#xff1a; ti-cgt-arm…

2023年排行前五的大規模語言模型(LLM)

2023年排行前五的大規模語言模型(LLM) 截至2023年&#xff0c;人工智能正在風靡全球。它已經成為熱門的討論話題&#xff0c;吸引了數百萬人的關注&#xff0c;不僅限于技術專家和研究人員&#xff0c;還包括來自不同背景的個人。人們對人工智能熱情高漲的原因之一是其在人類多…

CS5263替代停產IT6561連接DP轉HDMI音視頻轉換器ASL 集睿致遠CS5263設計電路原理圖

ASL集睿致遠CS5263是一款DP1.4到HDMI2.0b轉換器芯片&#xff0c;設計用于將DP1.4源連接到HDMI2.0b接收器。 CS5263功能特性&#xff1a; DP接口包括4條主通道、輔助通道和HPD信號。接收器支持每通道5.4Gbps&#xff08;HBR2&#xff09;數據速率。DP接收機結合了HDCP1.4和HDCP…

NVIDIA Omniverse與GPT-4結合生成3D內容

全球各行業對 3D 世界和虛擬環境的需求呈指數級增長。3D 工作流程是工業數字化的核心&#xff0c;開發實時模擬來測試和驗證自動駕駛車輛和機器人&#xff0c;操作數字孿生來優化工業制造&#xff0c;并為科學發現鋪平新的道路。 如今&#xff0c;3D 設計和世界構建仍然是高度…