第三章
建立、更新及刪除文檔
插入新文檔:
db.foo.insert({"bar" : "baz"}) |
我的理解:資料庫.集合.插入({key : value})
註:指插入速度比單次插入資料要快,因為批量插入只是單個TCP請求,避免了許多零碎的請求所帶來的開銷。單集合)
MongoDB2.0訊息長度為16MB
過程:執行插入後,使用的驅動程式會將資料轉換成BSON的形式,然後將其送入資料庫,資料庫解析BSON,檢驗是否包含"_id"鍵並且文檔不超過4MB,
註:所有主流語言的驅動會在傳送資料之前進行一些資料的有效性檢查文檔是否超長,是否包含UTF-8字元,或者使用了未知類型)。 可以在啟動資料庫伺服器時使用--objcheck選項,伺服器就會在插入之前先檢查文檔結構的有效性。
刪除文檔:
資料庫.集合.刪除()
註:會刪除users集合中所有的文檔,但不會刪除集合本身,原有的索引也會保留。
remove()函數查接受一個查詢文檔作為選擇性參數。如
db.users.remove({"key" : "world"}) |
註:刪除資料是永久性的,不能撤消,也不能恢複。
更新文檔:update:兩個參數,查詢文檔和修改器文檔。
使用修改器:
通常文檔只會有一部分要更新,利用原子的更新修改器,可以使得這種部分更新極為高效。更新修改器是種特殊的鍵,用來指定複雜的更新操作,比如調整,比如調整、增加或刪除鍵,還可能是運算元組或者內嵌文檔。
$set
以條件PD進行增加
> db.users.insert({"set" : "set"}) > > > db.users.find() { "_id" : ObjectId("502e9c960852475a6e43ba78"), "set" : "set" } > > > db.users.update({ "_id" : ObjectId("502e9c960852475a6e43ba78")} , ... {"$set" : {"hello2" : "hello2"}} ... ) > db.users.find() { "_id" : ObjectId("502e9c960852475a6e43ba78"), "hello2" : "hello2", "set" : "set" } > db.users.update({ "_id" : ObjectId("502e9c960852475a6e43ba78")} , ... {"$set" : {"nohello" : "nohello"}}) > db.users.find() { "_id" : ObjectId("502e9c960852475a6e43ba78"), "hello2" : "hello2", "nohello" : "nohello", "set" : "set" } > db.users.update({"hello2" : "hello2"} , ... {"$set" : {"a" : "a"}}) > db.users.find() { "_id" : ObjectId("502e9c960852475a6e43ba78"), "a" : "a", "hello2" : "hello2", "nohello" : "nohello", "set" : "set" } |
$unset 刪除
> db.users.update({"set" : "set"}, ... {"$unset" : {"a" : "a"}}) > db.users.find() { "_id" : ObjectId("502e9c960852475a6e43ba78"), "hello2" : "hello2", "nohello" : "nohello", "set" : "set" } 注意:只PD一個值就刪除這個key/value > db.users.find() { "_id" : ObjectId("502e9c960852475a6e43ba78"), "hello2" : "hello2", "nohello" : "nohello", "set" : "set" } > db.users.update({"set" : "set"}, ... {"$unset" : {"hello2" : "nohello"}}) > db.users.find() { "_id" : ObjectId("502e9c960852475a6e43ba78"), "nohello" : "nohello", "set" : "set" } |
同樣文檔中的文檔也適應如{"author.name" : "???"}
一定要使用以$開頭的修改器來修改鍵/值對。
增加和減少:
$inc
查看afs的值,只能為數字。
> db.users.update({"set" : "set"} , {"$inc" : {"afs" : 10}}) > db.users.find() { "_id" : ObjectId("502e9c960852475a6e43ba78"), "afs" : 10, "nohello" : "nohello", "set" : "set" } > db.users.update({"set" : "set"} , {"$inc" : {"afs" : 50}}) > db.users.find() { "_id" : ObjectId("502e9c960852475a6e43ba78"), "afs" : 60, "nohello" : "nohello", "set" : "set" } > db.users.update({"set" : "set"} , {"$inc" : {"afs" : -50}}) > db.users.find() { "_id" : ObjectId("502e9c960852475a6e43ba78"), "afs" : 10, "nohello" : "nohello", "set" : "set" } |
數組修改器:
$push
有就加到末尾,沒有就建立新數組。
資料操作,只能用在值為數組的鍵上,例如不能對整數做push,也不能對字串做POP,使用"$set"或"$inc"來修改標量值。
操作過程一樣
$ne $addToSet避免重複
數組的定位修改器
upsert
是一種特殊的更新,要是沒有文檔符合更新條件,就會以這個條件和更新文檔為基礎建立一個新的文檔,如果找到了匹配的文檔,則正常更新,upsert非常方便,不必預置集合,同一套代碼可以既建立又更新文檔。
save Shell協助程式
save是一個shell函數,可以在文檔不存在時插入,存在時更新,它只有一個參數:文檔,要是這個文檔含有"_id"鍵,save會調用upsert。否則,會調用插入。程式員可以非常方便地使用這個函數在shell中快速修改文檔。
更新多個文檔:
>db.users.update({"sr" : "10/13/1978"}, {$set : {"gift" : "happy"}},false, true) |
返回更新文檔:
本文出自 “煮酒品茶” 部落格,謝絕轉載!