標籤:
資料庫操作無非就是增、刪、改、查。這篇主要介紹增、刪、改。
1.增
Mongodb插入操作很簡單,使用關鍵字“insert”。執行個體:
1 > db.test.blog.insert({"haha":"xiaohaha","abc":"123"}) 2 > db.test.blog.find(); 3 { "_id" : ObjectId("5334dd149b7a445ea2166559"), "title" : "love", "content" : "I 4 love you" } 5 { "_id" : ObjectId("5334dd669b7a445ea216655a"), "job" : "java", "city" : "wuhan" 6 } 7 { "_id" : ObjectId("5334ec3f9b7a445ea216655b"), "a" : "b" } 8 { "_id" : ObjectId("5338bc89125a366c3f32dd00"), "haha" : "xiaohaha" } 9 { "_id" : ObjectId("5338bce3125a366c3f32dd01"), "haha" : "xiaohaha", "abc" : "12 10 3" } 11 >
使用insert關鍵字,裡面設定文檔。如果文檔中沒有“_id”,Mongodb會自動產生。
當執行插入操作時,資料庫會校正是否包含“_id”鍵,並且文檔不超過4MB,除此之外,不做其他檢查。這樣使得資料庫更加安全,遠離注入式攻擊(Mongodb在插入時不執行代碼)。
2.刪
1 > db.test.blog.remove({"a":"b"}) 2 > db.test.blog.find({"a":"b"}) 3 > db.test.blog.remove()
remove可以接受一個查詢文檔作為選擇性參數,給定參數以後,只有合格文檔才會被刪除。如果沒有帶參數,那麼就是刪除集合中的所有文檔,但是不會刪除集合本身,原來的索引也會保留。
3.改
文檔存入資料庫後,可以使用update方法來修改它,update有兩個參數,一個是查詢文檔,用來找出要更新的文檔,另一個是修改器文檔,描述對找到的文檔做哪些修改。更新操作時原子的,若是兩個更新同時發生,先到達伺服器的先執行,接著執行另一個。
更新方式一:文檔結構變動比較大使用
1 > var jobs = db.test.blog.findOne({"job":"java"}); //這裡這能查詢單個對象,才能在後面使用update修改 2 > jobs.job = "hadoop"; 3 hadoop 4 > jobs.exp = "5 year"; 5 5 year 6 > jobs.city = ["wuhan","beijin","shanghai"]; 7 [ "wuhan", "beijin", "shanghai" ] 8 > db.test.blog.update({"job":"java"},jobs); //使用update修改 9 > db.test.blog.find({"job":"hadoop"}); 10 { "_id" : ObjectId("5334dd669b7a445ea216655a"), "job" : "hadoop", "city" : [ "wuhan", "beijin", "shanghai" ], "exp" : "5 year" } 修改資料方式一代碼更新方式二:使用修改器,文檔只做部分更新使用
$set用來指定一個鍵的值。如果鍵不存在,則建立它。可以用來修改值,數組,內嵌文檔。
$unset用來卸載一個索引值對。
1 > db.test.blog.insert({"_id":0001,"name":"joe","age":25,"favortie":"book"}); //插入資料 2 > db.test.blog.find(); //查詢 3 { "_id" : 1, "name" : "joe", "age" : 25, "favortie" : "book" } 4 > db.test.blog.update({"name":"joe"}, //更新單個資料age,並且改變資料類型int->string 5 ... {"$set":{"age":"29"}}) 6 > db.test.blog.find(); 7 { "_id" : 1, "age" : "29", "favortie" : "book", "name" : "joe" } 8 > db.test.blog.update({"name":"joe"}, //變為數組 9 ... {"$set":{"favortie":["book","tv"]}}) 10 > db.test.blog.find(); 11 { "_id" : 1, "age" : "29", "favortie" : [ "book", "tv" ], "name" : "joe" }
$unset代碼
1 > db.test.blog.find(); 2 { "_id" : 1, "age" : "29", "favortie" : [ "book", "tv" ], "name" : "joe" } 3 > db.test.blog.update({"name":"joe"}, 4 ... {"$unset":{"age":1}}) 5 > db.test.blog.find(); 6 { "_id" : 1, "favortie" : [ "book", "tv" ], "name" : "joe" }
更新數字
$inc用來增加索引值,鍵不存在時建立
1 > db.test.blog.update({"name":"joe"},{"$inc":{"age":1}}); 2 > db.test.blog.find(); 3 { "_id" : 1, "age" : 1, "favortie" : [ "book", "tv" ], "name" : "joe" }
數組修改器
$push會向已有的數組末尾加入一個元素,要是沒有就建立數組
1 > db.test.blog.find(); 2 { "_id" : 1, "age" : 1, "like" : [ "eat", "booke" ], "name" : "joe" } 3 > db.test.blog.update({"name":"joe"},{$push:{"like":"abc"}}); 4 > db.test.blog.find(); 5 { "_id" : 1, "age" : 1, "like" : [ "eat", "booke", "abc" ], "name" : "joe" }
$pop可以從數組任何一端刪除元素。{$pop:{key:1}}從數組末尾刪除,{$pop:{key:1}}則從頭部刪除
$pull基於特定條件刪除
1 > db.test.blog.update({"name":"joe"},{$pull:{"like":"booke"}}); 2 > db.test.blog.find(); 3 { "_id" : 1, "age" : 1, "like" : [ "eat", "abc" ], "name" : "joe" }
數組定位
數組定位可以使用位置或者定位操作符“$”
數組下標都是從0開始,所以可以使用下標直接作為鍵來選擇元素
使用upsert(update or insert)
upsert是一種特殊的更新,要是沒有文檔符合更新要求,就會以這個條件和更新文檔做為基礎建立一個新的文檔。如果找到匹配的文檔,則正常更新。update的第三個參數表示是否使用upsert更新
1 > db.test.blog.find() //查詢所有資料 2 { "_id" : 1, "age" : 1, "like" : [ "eat", "abc" ], "name" : "joe" } //沒有我要更新的資料 3 > db.test.blog.update({"url":"www.baidu.com"},{"$inc":{"visits":1}},true) //使用upsert方式修改 4 > db.test.blog.find() //查詢所有資料,發現多了一個文檔 5 { "_id" : 1, "age" : 1, "like" : [ "eat", "abc" ], "name" : "joe" } 6 { "_id" : ObjectId("533a1c27b653a97435a02030"), "url" : "www.baidu.com", "visits 7 " : 1 } 8 > db.test.blog.update({"url":"www.baidu.com"},{"$inc":{"visits":1}},true) //再次使用upsert 9 > db.test.blog.find() 10 { "_id" : 1, "age" : 1, "like" : [ "eat", "abc" ], "name" : "joe" } //發現是修改文檔 11 { "_id" : ObjectId("533a1c27b653a97435a02030"), "url" : "www.baidu.com", "visits 12 " : 2 }
更新多個文檔
預設情況下,更新只對合格第一個文檔進行修改,如果有多個合格文檔,其餘文檔就沒有變化。如果想要更新所有匹配條件的文檔,就要設定第四個參數為true
1 > db.test.blog.find({"url":"www.baidu.com"}); //查詢url為baidu的記錄有兩條 2 { "_id" : ObjectId("533a1c27b653a97435a02030"), "url" : "www.baidu.com", "visits 3 " : 2 } 4 { "_id" : "2", "url" : "www.baidu.com", "visits" : "5" } 5 //更新所有合格資料 6 > db.test.blog.update({"url":"www.baidu.com"},{"$set":{"visits":10}},false,true) 7 8 > db.test.blog.find({"url":"www.baidu.com"}); //重新查詢,資料都修改了 9 { "_id" : ObjectId("533a1c27b653a97435a02030"), "url" : "www.baidu.com", "visits 10 " : 10 } 11 { "_id" : "2", "url" : "www.baidu.com", "visits" : 10 }
update的四個參數描述:
1.需要更新文檔匹配的條件
2.需要更新的資料
3.是否採用upsert方式更新:預設false
4.是否使用匹配條件的文檔都修改:預設false
mongoDB文檔操作