MongoDB資料插入、刪除、更新
1. MongoDB資料插入
- MongoDB插入文件
// 插入語法
db.[collectionName].insert({})
// example
db.sample.insert({name:"mongo"})
sample結果:
2. 批量插入文件
shell 這樣執行是錯誤的 db.[collectionName].insert([{},{},{},……..]),這樣僅可以插入第一條資料。
如圖:
shell 不支援批量插入
想完成批量插入可以用MongoDB的應用驅動或是shell的for迴圈
3.Save操作
save操作和insert操作區別在於當遇到_id相同的情況下
save完成儲存操作
insert則會報錯
如圖:
2. MongoDB資料刪除
- 刪除列表中所有資料
db.[collectionName].remove({})
集合的本身和索引不會被刪除 - 根據條件刪除資料
db.[collectionName].remove({key:value})
刪除集合sample中name等於c的紀錄
db.sample.remove({name:"c"})
3.小技巧
如果你想清除一個數據量十分龐大的集合直接刪除該集合並且重新建立索引的辦法比直接用remove的效率會高很多
3. MongoDB資料更新
- 強硬的文件替換式更新操作
// 語法
db.[collectionName].update({查詢器} ,{修改器})
此種文件更新方式,會用新的文件代替老的文件,因此要明確是否是真的符合自己的需求。
強硬的更新會用新的文件代替老的文件
2. insertOrUpdate操作
目的:查詢器查出來資料就執行更新操作,查不出來就替換操作
做法:
db.[collectionName].update({查詢器},{修改器},true)
第三個引數設定為true,代表insertOrUpdate,即存在即更新,否則插入該資料
3. 批量更新操作
預設情況下,當查詢器查詢出多條符合條件的資料時,預設修改第一條資料。那麼如何實現批量修改?
語法:
db.[collectionName] .update({查詢器},{修改器},false, true)
即新增第四個引數,該引數為true,則批量更新,為false,則更新一條
4. 使用修改器來完成區域性更新操作
4.1 $set修改器
$set修改器用來指定一個鍵值對,如果存在鍵就進行修改不存在則進行新增。
// 修改器名稱:$set
// 語法:
{$set:{field: value}}
// example:
{$set:{name:"Redis"}}
4.2
// 修改器名稱:$inc
// 語法:
{ $inc : { field : value } }
// example:
{ $inc : { "count" : 1 } }
案例:
4.3
// 修改器名稱:$unset
// 語法:
{ $unset: { field : 1} }
// example:
{ $unset : { "age" : 1 } }
案例:
4.4 $push修改器
$push修改器用法:
1.如果指定的鍵是陣列增追加新的數值
2.如果指定的鍵不是陣列則中斷當前操作Cannot apply $push/$pushAll modifier to non-array
3.如果不存在指定的鍵則建立陣列型別的鍵值對
4.此方法可新增重複資料
// 修改器名稱:$push
// 語法:{ $push : { field : value } }
// example:
{ $push : { language:"Oracle"}
下面對用法一一舉例:
如果指定的鍵是陣列增追加新的數值:
如果指定的鍵不是陣列則中斷當前操作:
如果不存在指定的鍵則建立陣列型別的鍵值對:
此方法可新增重複資料:
4.5 $pushAll
修改器
$pushAll
修改器用法和$push
相似他可以批量新增陣列資料
即可以新增整個陣列,如下:
// 修改器名稱:$pushAll
// 語法:{ $pushAll : { field : array} }
// example:
{ $pushAll : { database:["Oracle","MySQL"]}
案例:
4.6 $addToSet
修改器
$addToSet
修改器是如果目標陣列存在此項則不操作,不存在此項則加進去,即不新增重複資料。
// 修改器名稱:$addToSet
// 語法:{ $addToSet: { field : value } }
// example:
{ $addToSet: { database:"Oracle"}
案例:
4.7 $pop
修改器
$pop
修改器從指定陣列刪除一個值1刪除最後一個數值,-1刪除第一個數值。
// 修改器名稱:$pop
// 語法:{ $pop: { field : value } }
// example:
{ $pop: { database:1}
案例:
4.8 $pull
修改器
$pull
修改器是刪除一個被指定的數值。
// 修改器名稱:$pull
// 語法:{ $pull: { field : value } }
// example:
{ $pull: { database: "Oracle"}
案例:
4.9 $pullAll
修改器
$pullAll
修改器是一次性刪除多個指定的數值。
// 修改器名稱:$pullAll
// 語法:{ $pullAll: { field : array} }
// example:
{ $pullAll: { database: ["MySQL","MongoDB"]}
案例:
4.10 $
陣列定位符
1.$
陣列定位器,如果陣列有多個數值我們只想對其中一部分進行操作我們就要用到定位器($
)
// 修改器名稱:$
// 語法:{ $set: { array.$.field : value} }
// example:
{ $set: { database.$.com : "sun"}
例如有文件:
{ “_id” : ObjectId(“5656d2876cc2cfd9ab5373b7”), “name” : “evers”, “age” : 25, “database” : [ { “type” : “Oracle”, “name” : “OracleDB” }, { “type” : “MySQL”, “name” : “MySQLDB” }, { “type” : “MongoDB”, “name” : “MongoDBDB” } ] }
我們要把type等於MongoDB的文件增加一個作者author是Mongo
辦法:
db.sample.update({"database.type":"MongoDB"},{$set:{"database.$.author":"Mongo"}})
5 . $addToSet
與$each
結合完成批量陣列更新
db.sample.update({name:"evers"},{$addToSet:{database:{$each:["JS","DB","DB" ]}}})
$each
會迴圈後面的陣列把每一個數值進行$addToSet
操作
6 . 記憶體分配與查詢效率
當document被建立的時候DB為其分配記憶體和預留記憶體,當修改操作不超過預留內層的時候則速度非常快反而超過了就要分配新的記憶體則會消耗時間。
7 . runCommand函式和findAndModify函式
runCommand可以執行mongoDB中的特殊函式,findAndModify就是特殊函式之一,他的作用是返回update或remove後的文件。
runCommand({"findAndModify":"processes",
query:{查詢器},
sort{排序},
new:true
update:{更新器},
remove:true
}).value
// example:
ps = db.runCommand({
"findAndModify":"sample",
"query":{"name":"evers"},
"update":{"$set":{"email":"1221"}},
"new":true
}).value
這裡有一段摘自MongoDB權威指南的findAndModify函式的介紹:
findAndModify的呼叫方式和普通的更新略有不同,還有點慢,這是因為它要等待資料庫的響應。這對於操作查詢以及執行其他需要取值和賦值風格的原子性操作來說是十分方便的。
findAndModify命令中每個鍵對應的值如下所示。
findAndModify 字元竄,集合名。
query 查詢文件,用來檢索文件的條件。
sort 排序結果的條件。
update 修改器文件,對所找到的文件執行的更新。
remove 布林型別,表示是否刪除文件。
new 布林型別,表示返回的是更新前的文件還是更新後的文件。預設是更新前的文件。
“update”和”remove”必須有一個,也只能有一個。要是匹配不到文件,這個命令會返回一個錯誤。
這個命令有些限制。它一次只能處理一個文件,也不能執行upsert操作,只能更新已有文件。
相比普通更新來說,findAndModify速度要慢一些。大概耗時相當於一次查詢,一次更新和一次getLastError順序執行所需的時間。
db.runCommand(“findAndModify”:集合名,”query”:{查詢條件},”upadte”:{修改器})