建立文檔
向MongoDB插入資料,使用insert,
如:db.refactor.insert({"refactor's blog":"http://www.cnblogs.com/refactor"})
這個操作會給 文檔 增加 一個"_id",鍵,並儲存在資料庫中。
批量插入
如果要插入多個文檔,使用批量插入會快一些,批量化插入能傳入一個有文檔構成的資料給資料庫
一次批量插入只是單個的TCP請求,避免了許多零碎的請求帶來的開銷.由於無需處理大量的訊息頭,
這樣能減少插入時間.每當單個文檔發送致資料庫時,會有一個頭部資訊,告訴資料庫對指定的集合做
插入操作.用批量插入的話,資料庫就不用重複的處理每個文檔的這種頭部資訊了.
目前的版本MongoDB訊息的最大長度是16M,使用批量插入是有這個限制的.
插入的原理和作用
當執行插入的時候,使用的驅動程式會將資料轉換成BSON的形式,然後將其送入資料庫.資料庫解析
BSON,檢驗是否包含"_id"鍵並且不超過16M,除此之外,不做別的驗證,就只是簡單的將文檔原樣的
存入資料庫.這樣做的壞處是允許插入無效的資料,好處是能讓資料庫更加安全,遠離注入式攻擊.
所有的主流語言的驅動會在傳送資料之前進行一些資料的有效性檢查(文檔是否超長,是否含非utf-8的字元,
是否使用了未知類型).同樣也可以啟動資料庫伺服器的時候使用--objcheck選項,這樣伺服器就會在插入
之前先檢驗文檔結構的有效性,當然這樣要犧牲效能.
查看doc文檔轉化為BSON的大小(以位元組為單位),在shell中使用Object.bsonsize(doc)
刪除文檔
db.users.remove()
會刪除users集合的所有文檔,但不會刪除集合本身,原有的索引也會保留.
remove函數可以接受一個查詢文檔作為選擇性參數,給定這個參數,只有合格文檔才會被刪除.
db.users.remove({"name":"Refactor"})
刪除資料的永久性的,不能撤銷和恢複.
如果要清除整個集合,直接刪除集合(然後重建索引)比刪除集合中所有的文檔要快.
刪除集合:db.drop_collection("users")
更新文檔
update有兩個參數,一個是查詢文檔,用來找出要更新的文檔,另一個是修改器文檔,描述對找到的文檔進行那些更改
更新的操作是原子性的,若兩個更新同時發生,先到伺服器的先執行,然後執行另一個.最後的更新會顯示在資料庫
文檔替換
更新最簡單的就是使用一個新文檔來替代匹配的文檔,這適用於模式結構發生較大變化的時候.如將下面的文檔
{
"name":"refactor",
"friends":20,
enemies:2
}
更改為
{
"name":"refactor",
"relationships":
{
"friends":20,
enemies:2
}
}
使用修改器
通常文檔只會有一部分更新,利用原子的"更新修改器",更新修改器是特殊的鍵,用來指定複雜的更新操作,比如:
調整,增加,刪除鍵,運算元組,操作內嵌文檔.
一般網站都有計數器,來記數公有多少人訪問,可以使用原子修改器原子性的完成整個功能.如:
"$set"修改器入門
"$set"用來指定一個鍵的值,如果鍵不存在,則建立,這對更新模式或者增加使用者定義鍵來說很方便.
如:
db.users.insert(
{
"name":"refactor",
"age":23,
"sex":"male"
}
)
添加喜歡的書籍:
db.users.update(
{
"name":"refactor"
},
{
"$set":{"book":"war and peace"}
}
)
db.users.findOne(
{"name":"refactor"}
)
修改喜歡的資料
db.users.update(
{
"name":"refactor"
},
{
"$set":{"book":"war and peace2"}
}
)
"$set"可以修改鍵的資料類型,如果喜歡多本書,
將book鍵的值變為一個數組
db.users.update(
{
"name":"refactor"
},
{
"$set":{"book":["war and peace","war and peace2"]}
}
)
使用"$unset"將鍵刪除,沒有要刪除的鍵也不報錯
db.users.update(
{
"name":"refactor"
},
{
"$unset":{"book":1}
}
)
使用"$set"修改內嵌文檔
db.blog.insert(
{
"title":"refactor's blog",
"Content":"refactor's blog test",
"author":
{
"name":"refactor",
"email":"295240648@163.com"
}
}
)
db.blog.update(
{
"author.name":"refactor"
},
{
"$set":{"author.name":"refactor2"}
}
)
db.blog.findOne(
{
"title":"refactor's blog"
}
)
增加,修改,刪除鍵的時候,應該使用$修改器.一定要使用$開頭的修改器來修改索引值對.
使用"$inc" 增加和減少
"$inc"用來增加已有鍵的值,若不存在鍵,則增加.用於分析資料,因果關係,投票或其他有變化值的地方.
如:
db.users.insert(
{"url":"http://www.cnblogs.com/refactor"}
)
使用"$inc" 增加一個鍵pageViews,預設值為10000
db.users.update(
{"url":"http://www.cnblogs.com/refactor"},
{"$inc":{"pageViews":10000}}
)
使用"$inc"給鍵pageViews,再增加10000
db.users.update(
{"url":"http://www.cnblogs.com/refactor"},
{"$inc":{"pageViews":10000}}
)
使用"$inc"給鍵pageViews,再減少10000
db.users.update(
{"url":"http://www.cnblogs.com/refactor"},
{"$inc":{"pageViews":-10000}}
)
"$inc"和"$set"用法相似,用來增加或減少數字."$inc"只能用於整數,長整數或雙精確度浮點數.
雖然很多語言能將 null,bool,有數字構成的字串 轉化成 數字,但使用"$inc"仍會報錯:
"$inc"鍵的值也必須為數字.
數組修改器
"$push"和"$pop"只能用於數組.
如果指定的鍵已存在,"$push"會向已有的數組末尾加入一個元素,如果鍵不存在,就建立一個新數組.
如:
db.blog.insert(
{
"title":"refactor's blog",
"Content":"refactor's blog test",
"author":
{
"name":"refactor",
"email":"295240648@163.com"
}
}
)
向以上文檔中,添加一個包含一個數組的"comment"鍵,還向 comment 數組push一個評論.
這個數組會自動建立,並加入評論:
db.blog.update(
{"title":"refactor's blog"},
{
$push:
{
"comments":
{
"name":"refactor2",
"content":"nice"
}
}
}
)
還想添加一條評論:
db.blog.update(
{"title":"refactor's blog"},
{
$push:
{
"comments":
{
"name":"refactor3",
"content":"good"
}
}
}
)
如果一個值不在數組裡就把它加進去.可以在查詢文檔時使用"$ne".
使用"$addToSet"
db.users.insert(
{
"userName":"refactor",
"emails":
[
"295240648@163.com",
"295240648@126.com"
]
}
)
向emails添加新地址,用"$addToSet"避免重複
db.users.update(
{"userName":"refactor"},
{
"$addToSet":
{
"emails":"295240648@163.com"
}
}
)
這樣"295240648@163.com" 不會插入到emails中
db.users.update(
{"userName":"refactor"},
{
"$addToSet":
{
"emails":"295240648@qq.com"
}
}
)
這樣"295240648@qq.com" 會插入到emails中
將"$addToSet"和"$each"一起使用,可以添加不同的值.
db.users.update(
{"userName":"refactor"},
{
"$addToSet":
{
"emails":
{
"$each":
[
"295240648@111.com",
"295240648@112.com",
"295240648@113.com"
]
}
}
}
)
使用"$pop",可以從數組任何一端刪除元素.
{$pop:{key:1}}從數組末尾刪除一個元素
{$pop:{key:-1}}從數組頭部刪除一個元素
使用"$pull",可以根據特定條件刪除元素,也可以根據位置刪除元素
db.users.update(
{"userName":"refactor"},
{
"$pull":
{
"emails":"295240648@111.com"
}
}
)
"$pull"會將所有匹配的部分刪掉,對於數組[1,1,2,1]執行pull 1,得到的結果數組是[2]