一、文檔數據插入操作
1、插入文檔
db.[documentName].insert({})
2、批量插入文檔
shell這樣執行是錯誤的,如db.[documentName].insert([{},{},{},......]);
shell不支持批量插入,想實現批量插入可以用mongo的應用驅動或是shell的for循環。
3、Save操作
save操作和insert操作區別在於當遇到_id相同的情況下,save完成修改操作,insert則會報錯。
二、文檔數據刪除操作
1、刪除列表中的所有數據
db.[documentName].remove()
集合的本身和索引不會被刪除。
2、根據條件刪除
db.[documentName].remove({})
例如:刪除集合text中name等於uspcat的記錄,如下:
db.text.remove({name:"uspcat"})
3、小技巧
如果想刪除一個數據量十分龐大的集合,直接刪除該集合並且重新建立索引的辦法,比直接用remove的效率高很多。
三、文檔數據更新操作
1、強硬的文檔替換式更新操作
db.[documentName].update({查詢器},{修改器})
強硬的更新會用新的文檔代替老的文檔。例如:
> db.person.insert({name:"zhangyah",age:"25"})
> db.person.find()
{ "_id" : ObjectId("51e2bc0b4daf6acd8de34139"), "name" : "zhangyah", "age" : "25" }
> db.person.update({name:"zhangyah"},{age:26})
> db.person.find()
{ "_id" : ObjectId("51e2bc0b4daf6acd8de34139"), "age" : 26 }
2、主鍵衝突的時候會報錯並且停止更新操作
因爲是強硬替換,當替換的文檔和已有文檔ID衝突的時候,則系統會報錯。
3、insertOrUpdate操作
目的:查詢器查出來的數據就執行更新操作,查不出來的數據就執行替換操作。
做法:db.[documentName].update({查詢器},{修改器},true)
4、批量更新操作
默認情況,當查詢器查詢出多條數據的時候,默認就修改第一條數據。
如何實現批量修改,如下:
db.[documentName].update({查詢器},{修改器},false,true)
5、使用修改器來完成局部更新操作
6、$addToSet與$each結合完成批量數據更新
db.[documentName].update({查詢器},{$addToSet:{books:{$each:["js","db"]}}})
$each會循環後面的數組把每一個數值進行$addToSet操作。
7、存在分配與查詢效率
當document被創建的時候,DB數據庫爲其分配內存和預留內存。
當修改操作不超過預留內存的時候,則速度非常快;
反而超過了預留內存,則就要分配新的內存,消耗一些時間。
8、findAndModify的調用方式和普通的更新略有不同,還有點慢,這是因爲它要等待數據庫的響應。
這對於操作查詢以及執行其他需要取值和賦值風格的原子性操作來說是十分方便的。
findAndModify命令中每個鍵對應的值如下所示。
findAndModify 字符竄,集合名。
query 查詢文檔,用來檢索文檔的條件。
sort 排序結果的條件。
update 修改器文檔,對所找到的文檔執行的更新。
remove 布爾類型,表示是否刪除文檔。
new 布爾類型,表示返回的是更新前的文檔還是更新後的文檔。默認是更新前的文檔。
"update"和"remove"必須有一個,也只能有一個。要是匹配不到文檔,這個命令會返回一個錯誤。
這個命令有些限制。它一次只能處理一個文檔,也不能執行upsert操作,只能更新已有文檔。
相比普通更新來說,findAndModify速度要慢一些。大概耗時相當於一次查找,一次更新和一次getLastError順序執行所需的時間。
db.runCommand("findAndModify":集合名,"query":{查詢條件},"upadte":{修改器})