批量更新某個字段
例1:
db.getCollection('bond_sentiment_news').find({"source" : 2,"siteUrl" : "http://www.21jingji.com/"}).forEach( function(item){ db.getCollection('bond_sentiment_news').update({"_id":item._id},{$set:{"siteName":"21經濟網"}}) } )
例2:
db.getCollection('my_booking').find({"hospitalName":/xx醫院/,openId:/^2/}).forEach( function(item){ db.getCollection('my_booking').update({"_id":item._id},{$set:{"payType": "1"}}) } )
查詢出hospitalName是xx醫院和openId以2開頭的所有記錄,並且更新my_booking表中的payType為1.
例3:
db.getCollection('my_booking').find({"hospitalName":/運城市中心醫院/,openId:{$not:/^2/}}).forEach( function(item){ db.getCollection('my_booking').update({"_id":item._id},{$set:{"outTradeNo1": item.outTradeNo2}}) } )
查詢出xx醫院和不已2開頭的openId的所有記錄,並且將每條記錄的outTradeNo2賦值給outTradeNo1.
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.2inc修改器inc修改器只是使用與數字類型,他可以為指定的鍵對應的數字類型的數值進行加減操作.
// 修改器名稱:$inc
// 語法: { $inc : { field : value } } // example: { $inc : { "count" : 1 } }
案例:

4.3 unset修改器unset修改器用法很簡單,就是刪除指定的鍵值對。
// 修改器名稱:$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”:{修改器})