添加文檔
db.foo.insert({"test" : "test"})
1、插入 時MongoDB會檢查文檔是否包含_id,如果文檔沒有指定_id,MongoDB會為其創建。
2、對于多個文檔,我們推薦批量操作,批量操作有如下優點:更少的連接次數、更少的信息頭檢測、對“待插入集合”的靈活控制;
3、默認情況下,插入文檔時MongoDB僅檢查傳入數據是否包含 _id 以及數據大小是否超過16MB( v1.8 - 為 4M ) ,除此之外不再做任何驗證;
4、MongoDB在插入數據時不執行任何代碼,因此沒有注入攻擊的風險;
刪除文檔
// 刪除全部文檔(清空集合)
db.foo.remove();
// 刪除指定記錄
db.foo.remove({"test" : "test"});
建議: 如果要清空集合,而且集合內包含了過多記錄時,不妨考慮使用 db.drop_collection(‘foo’) 命令直接刪除集合,然后使用 db.foo.ensureIndex() 命令重建索引 (之前的索引已經被 drop 掉了)。
更新文檔
// 原 文檔
{
"_ id" : ObjectId ( "4b2b9f67a1f631733d917a7a " ),
" name" : "joe " ,
" friends" : 32 ,
" enemies" : 2
}
// 期望 結果
{
"_ id" : ObjectId ( "4b2b9f67a1f631733d917a7a" ),
" username" : "joe" ,
" relationships" :
{
" friends" : 32 ,
" enemies" : 2
}
}
操作:
// 操作:首先查找記錄
var joe = db . users . findOne ({ "name" : " joe" });
// 修改記錄 屬性,很普通的 JavaScript 語法
joe . relationships = { "friends" : joe . friends , "enemies" :
joe . enemies };
joe . username = joe . name ;
delete joe . friends ;
delete joe . enemies ;
delete joe . name ;
// 更新
db . users . update ({ " name" : "joe" }, joe );
update有2個可選的bool參數,第1個表示是否開啟upsert模式(文檔存在時更新,不存在時自動創建);第2個表示是否開啟multi模式(默認情況下update操作只會更新第一個匹配到的文檔,如果開啟multi模式,則會更新所有匹配到的文檔)。
更新文檔 - UPSERT 模式
// 更新:指定第三個參數為 true 可以開啟 upsert 模式
db . users . update ({ " name" : "joe" }, joe, true );
在upsert模式下,如果找到匹配的記錄則更新之,否則如果找不到匹配記錄就會創建一條新的記錄。
更新文檔 - MULTI 模式
// 更新:指定第四個參數為 true 可以開啟 multi 模式
db . users . update ({ " name" : "joe" }, joe, true , true );
默認情況下update只會更新第一個匹配到的文檔,開啟multi模式,才會更新所有匹配到的文檔。
需要注意的是:MongoDB的update操作是替換整個文檔的,而不是對文檔做出局部修改。如果要單獨修改一個或多個鍵或值,請使用修改器。
更新文檔 - 修改器
修改器 | 說明 | 備注 |
$inc | 增加或減少數字的值,鍵不存在時會自動創建 | 數字 |
$set | 設置指定鍵的值,鍵不存在時會自動創建 | |
$unset | $set的反操作,會刪除鍵及鍵值 | |
$push | 將元素追加到數組末尾,數組不存在會自動創建 | 數組 |
$pushAll | $push的批量操作版本 | 數組 |
$addToSet | 同$pushAll,但會自動過濾重復元素 | 數組 |
$pop | {$pop : {key : 1}}——從數組末尾移除元素 {$pop : {key : -1}}——從數組開頭移除原色 | 數組 |
$pull | 從數組中移除所有匹配的元素 | 數組 |
$pullAll | $pull的批量操作版本 | 數組 |
$rename | 修改指定鍵的鍵名 | 鍵 |
$bit | 對整形鍵值執行位操作“與”、“或”等 | 數字 |
定位操作符 - $
我們在更新文檔的時候,可以這樣寫:{ '$set': { foo.3.hits = 5 } }【對數組中下標是3的進行了修改】。問題是假設我們不知道元素的下標該怎么辦?這時候就可以使用$來定位查詢文檔已經匹配的元素。
// $inc 操作
db . blog . update (
{ " post" : post_id },
{ "$ inc" : { " comments. $ .votes" : 1 } }
);
// $set 操作
db . blog . update (
{ " comments.author" : "John" },
{ "$ set" : { " comments. $ .author" : "Jim" } }
);
/* 注意:定位符只會更新第 1 個匹配到的元素!!! */
MongoDB的增刪改操作都是瞬間完成的,無需等待執行結果,而且操作完成后不會再向客戶端反饋結果。顯而易見,速度快是它的優點,無法保證操作數據的完整性是它的缺點。
新聞熱點
疑難解答