Mongodb在UPDATE操作中使用$pull的操作方法
本文基于Mongodb的官方文檔,介紹使用$pull, 按照指定條件刪除數(shù)組中的元素。
定義
在UPDATE中使用$pull操作符,刪除數(shù)組中的指定元素或刪除符合條件的數(shù)組元素。
語法
在UPDATE操作中使用$pull操作符時,按照下面的語法。
{$pull: {<field1>: <value|condition>, <field2>: <value|condition>, ...}}刪除嵌入文檔或數(shù)組當(dāng)中的數(shù)組元素時,需要使用點(diǎn)操作符。
行為
- 自mongodb5.0開始,UPDATE操作按照字段名稱的字典順序更新字段。當(dāng)字段中包含數(shù)字時,按照數(shù)字順序依次更新字段。當(dāng)然,對一個文檔的多個字段操作,是原子性的。
- 當(dāng)在嵌入文檔數(shù)組類型的數(shù)組指定一個刪除條件時,$pull操作符的刪除條件類似于集合中的文檔查詢條件一樣查詢出數(shù)組中的每一個文檔元素。
- 當(dāng)指定刪除的值是數(shù)組時,指定的數(shù)組必須嚴(yán)格等于刪除字段中數(shù)組元素,包括數(shù)組元素的順序。
- 當(dāng)指定刪除的值是文檔時,要求文檔中的字段和即將刪除元素文檔中的字段和值相同,字段順序可以不一致。
- mongodb 5.0版本以后,向$pull傳入空表達(dá)式({ })時,mongodb不再拋出錯誤。空表達(dá)式不會修改字段值 ,也不會在oplog中,添加新的操作記錄。
應(yīng)用
刪除數(shù)組當(dāng)中與指定值相等的元素
創(chuàng)建stores集合
db.stores.insertMany([
{
_id:1,
fruits: ["apples", "pears", "oranges", "grapes", "bananas"],
vegetables: ["carrots", "celery", "squash", "carrots"]
},
{
_id:2,
fruits: ["plums", "kiwis", "oranges", "bananas", "apples"],
vegetables: ["broccoli", "zucchini", "carrots", "onions"]
}
])構(gòu)建數(shù)據(jù)更新語句,刪除fruits數(shù)組中的元素"apples", "oranges",刪除vegetables數(shù)組中的元素"carrots"
db.stores.updateMany({},{$pull:{fruits:{$in: ["apples", "oranges"]}, vegetables: "carrots"}})查詢數(shù)據(jù)更新后的結(jié)果

刪除數(shù)組中符合查詢條件的元素
創(chuàng)建集合profile,其中votes是數(shù)組類型字段
db.profile.insertOne({_id: 1, votes:[3,5,6,7,7,8]})構(gòu)建數(shù)據(jù)更新語句,刪除votes字段中大于等于6的數(shù)據(jù)。
db.profile.updateOne({_id: 1}, {$pull: {votes: {$gte: 6}}})查詢操作結(jié)果

使用bulkWrite()方法完成數(shù)組元素刪除操作
構(gòu)建一個bulkWrite操作過程,完成下面幾個步驟
- 向集合中插入數(shù)據(jù),其中字段votes是數(shù)組字段
- 更新插入的數(shù)據(jù),刪除大于等于6的元素
- 更新插入的數(shù)據(jù),刪除小于等于3的元素
try{
db.profileBulkWrite.bulkWrite([
{
insertOne: {
"document": {_id: 1, votes: [3,5,6,7,7,8]}
}
},
{
updateOne: {
"filter": {_id: 1},
"update": {$pull: {votes: {$gte: 6}}}
}
},
{
updateOne: {
"filter": {_id: 1},
"update": {$pull: {votes: {$lte: 3}}}
}
}
])
} catch (error){
print(error)
}查詢bulkWrite()操作結(jié)果
db.profileBulkWrite.find()
刪除數(shù)組中的文檔
創(chuàng)建survey并插入數(shù)據(jù),其中results字段是文檔數(shù)組類型
db.survey.insertMany([
{_id: 1, results: [{item: "A", score: 5}, {item: "B", score: 8}]},
{_id: 2, results: [{item: "C", score: 8}, {item: "B", score: 4}]}
])構(gòu)架數(shù)據(jù)更新語句,刪除results數(shù)組中score字段是8,item字段是B的文檔。
db.survey.updateMany({},{$pull: {results: {score: 8, item: "B"}}})刪除嵌套數(shù)組中的文檔
創(chuàng)建survey文檔并插入數(shù)據(jù)
db.survey.insertMany([
{_id: 1, results: [
{item: "A", score: 5, answers:[{q:1, a:4}, {q:2, a:6}]},
{item: "B", score: 8, answers:[{q:1, a:8}, {q:2, a:9}]}
]},
{_id: 2, results: [
{item: "C", score: 8, answers:[{q:1, a:8}, {q:2, a:7}]},
{item: "B", score: 4, answers:[{q:1, a:0}, {q:2, a:8}]}
]}
])構(gòu)建數(shù)據(jù)更新語句,將包含q的值為2, a的值大于等于8的文檔從results數(shù)組中刪除
db.survey.updateMany({},{ $pull: { "results": {
answers: {
$elemMatch: {
q: 2,
a: { $gte: 8 }
}
}
} } })到此這篇關(guān)于Mongodb在UPDATE操作中使用$pull的操作方法的文章就介紹到這了,更多相關(guān)Mongodb使用$pull操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MongoDB數(shù)據(jù)庫基礎(chǔ)操作總結(jié)
這篇文章主要介紹了MongoDB數(shù)據(jù)庫基礎(chǔ)操作,結(jié)合實(shí)例形式總結(jié)分析了MongoDB數(shù)據(jù)庫創(chuàng)建、刪除、集合、文檔等基本操作技巧,需要的朋友可以參考下2020-06-06
Mongodb?刪除文檔Delete與Remove的區(qū)別解析
這篇文章主要介紹了Mongodb?刪除文檔Delete與Remove的區(qū)別,要從集合中刪除所有文檔,請將空過濾器文檔傳遞{}給該?db.collection.deleteMany()方法,本文通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
Linux服務(wù)器下MariaDB 10自動化安裝部署
這篇文章主要介紹了Linux服務(wù)器下MariaDB 10自動化安裝部署,需要的朋友可以參考下2016-08-08
MongoDB學(xué)習(xí)筆記之GridFS使用介紹
這篇文章主要介紹了MongoDB學(xué)習(xí)筆記之GridFS使用介紹,本文介紹了GridFS的作用、GridFS的一些使用方法、GridFS實(shí)現(xiàn)原理及注意事項(xiàng)等,需要的朋友可以參考下2015-07-07
MongoDB使用小結(jié):一些不常見的經(jīng)驗(yàn)分享
最近一年忙碌于數(shù)據(jù)處理相關(guān)的工作,跟MongoDB打交道極多,以下為實(shí)踐過程中的Q&A,后續(xù)會不定期更新補(bǔ)充2017-03-03

