mongodb中save方法

前面我簡(jiǎn)單介紹了下MongoDB怎樣插入數(shù)據(jù).那么數(shù)據(jù)插入到數(shù)據(jù)庫(kù)中,就可能會(huì)修改數(shù)據(jù).在MongoDB中,它提供了修改數(shù)據(jù)的方法:update.下面,我來簡(jiǎn)單說下update的使用方法.

首先,我們操作的數(shù)據(jù)都存放在test數(shù)據(jù)庫(kù)中的name集合,集合中有4條記錄如下:

> db

test

> show collections

name

system.indexes

> db.name.find()

{ "_id" : ObjectId("5059221f955cfb1fd75066cb"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("5059223a955cfb1fd75066cc"), "fname" : "xiaoqiang", "lname" : "he" }

{ "_id" : ObjectId("50592245955cfb1fd75066cd"), "fname" : "dengdeng", "lname" : "pan" }

{ "_id" : ObjectId("50592253955cfb1fd75066ce"), "fname" : "guage", "lname" : "zeng" }

下面我們來試著修改一下這些數(shù)據(jù).在前面的插入中,我說過,插入時(shí)可以以文檔的的方式插入,也可以先把文檔賦值給變量,再以變量的方式插入.update方法也可以用這兩種方式.我先用文檔的方式來修改集合中的第二條記錄,命令如下:

> db.name.update({"_id" : ObjectId("5059223a955cfb1fd75066cc")},{"fname" : "qiang", "lname" : "he"})

> db.name.find()??? #檢查發(fā)現(xiàn),數(shù)據(jù)修改過來了,和預(yù)期的結(jié)果一樣

{ "_id" : ObjectId("5059221f955cfb1fd75066cb"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("5059223a955cfb1fd75066cc"), "fname" : "qiang", "lname" : "he" }

{ "_id" : ObjectId("50592245955cfb1fd75066cd"), "fname" : "dengdeng", "lname" : "pan" }

{ "_id" : ObjectId("50592253955cfb1fd75066ce"), "fname" : "guage", "lname" : "zeng" }

我們?cè)儆米兞康姆绞絹硇薷脑摷现械牡谌龡l記錄.首先將它找出來賦值給變量someone:

> someone=db.name.findOne({"_id" : ObjectId("50592245955cfb1fd75066cd")})

{

"_id" : ObjectId("50592245955cfb1fd75066cd"),

"fname" : "dengdeng",

"lname" : "pan"

}

重新賦值你要修改的內(nèi)容來修改變量someone的值:

> someone.fname="deng"

deng

用修改過的變量替換之前文檔的位置來達(dá)到修改數(shù)據(jù)的目的:

> db.name.update({"_id" : ObjectId("50592245955cfb1fd75066cd")},someone)

> db.name.find()??? #檢查發(fā)現(xiàn),數(shù)據(jù)修改過來了,和預(yù)期的結(jié)果一樣

{ "_id" : ObjectId("5059221f955cfb1fd75066cb"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("5059223a955cfb1fd75066cc"), "fname" : "qiang", "lname" : "he" }

{ "_id" : ObjectId("50592245955cfb1fd75066cd"), "fname" : "deng", "lname" : "pan" }

{ "_id" : ObjectId("50592253955cfb1fd75066ce"), "fname" : "guage", "lname" : "zeng" }

之前我說過,save函數(shù)實(shí)際就是根據(jù)參數(shù)條件,調(diào)用了insert或update函數(shù).那么save方法是否也能實(shí)現(xiàn)數(shù)據(jù)的修改操作呢?下面我們來實(shí)驗(yàn)一下.首先還是以文檔的方式來進(jìn)行修改操作:

> db.name.save({"_id" : ObjectId("50592253955cfb1fd75066ce")}, {"fname" : "dongren", "lname" : "zeng"})

> db.name.find()??? #檢查發(fā)現(xiàn),數(shù)據(jù)修改過來了,但和預(yù)期的結(jié)果不一樣,跟之前插入數(shù)據(jù)一樣,save方法也同樣將第二個(gè)參數(shù)"忽略"了.

{ "_id" : ObjectId("5059221f955cfb1fd75066cb"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("5059223a955cfb1fd75066cc"), "fname" : "qiang", "lname" : "he" }

{ "_id" : ObjectId("50592245955cfb1fd75066cd"), "fname" : "deng", "lname" : "pan" }

{ "_id" : ObjectId("50592253955cfb1fd75066ce") }

正確的操作方式如下:

> db.name.save({"_id" : ObjectId("50592253955cfb1fd75066ce"), "fname" : "dongren", "lname" : "zeng"})

> db.name.find()??? #檢查發(fā)現(xiàn),數(shù)據(jù)修改過來了,和預(yù)期的結(jié)果一樣

{ "_id" : ObjectId("5059221f955cfb1fd75066cb"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("5059223a955cfb1fd75066cc"), "fname" : "qiang", "lname" : "he" }

{ "_id" : ObjectId("50592245955cfb1fd75066cd"), "fname" : "deng", "lname" : "pan" }

{ "_id" : ObjectId("50592253955cfb1fd75066ce"), "fname" : "dongren", "lname" : "zeng" }

下面使用變量的方式來修改:

> someone=db.name.findOne({"_id" : ObjectId("50592253955cfb1fd75066ce")})

{

"_id" : ObjectId("50592253955cfb1fd75066ce"),

"fname" : "dongren",

"lname" : "zeng"

}

> someone.fname="guage"

guage

> db.name.save(someone)

> db.name.find()??? #檢查發(fā)現(xiàn),數(shù)據(jù)修改過來了,和預(yù)期的結(jié)果一樣

{ "_id" : ObjectId("5059221f955cfb1fd75066cb"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("5059223a955cfb1fd75066cc"), "fname" : "qiang", "lname" : "he" }

{ "_id" : ObjectId("50592245955cfb1fd75066cd"), "fname" : "deng", "lname" : "pan" }

{ "_id" : ObjectId("50592253955cfb1fd75066ce"), "fname" : "guage", "lname" : "zeng" }

下面,我們也同樣來看看save和update這兩方法的具體實(shí)現(xiàn).首先是save方法:

> db.name.save

function (obj) {

if (obj == null || typeof obj == "undefined") {

throw "can't save a null";

}

if (typeof obj == "number" || typeof obj == "string") {

throw "can't save a number or string";

}

if (typeof obj._id == "undefined") {

obj._id = new ObjectId;

return this.insert(obj);

} else {

return this.update({_id:obj._id}, obj, true);

}

}

參數(shù)說明:

obj:要更新的記錄胰柑,只能是單條記錄耳贬,如果collection沒有存在與obj一樣的id排拷,則添加一條記錄丸氛,否則更新.

再來看看update方法:

> db.name.update

function (query, obj, upsert, multi) {

assert(query, "need a query");

assert(obj, "need an object");

var firstKey = null;

for (var k in obj) {

firstKey = k;

break;

}

if (firstKey != null && firstKey[0] == "$") {

this._validateObject(obj);

} else {

this._validateForStorage(obj);

}

if (typeof upsert === "object") {

assert(multi === undefined, "Fourth argument must be empty when specifying upsert and multi with an object.");

opts = upsert;

multi = opts.multi;

upsert = opts.upsert;

}

this._db._initExtraInfo();

this._mongo.update(this._fullName, query, obj, upsert ? true : false, multi ? true : false);

this._db._getExtraInfo("Updated");

}

參數(shù)說明:

1)query:查詢條件,類似于update語(yǔ)句內(nèi)where后面的內(nèi)容

2)obj:update的對(duì)象和一些更新的操作符(如$俊戳、$inc等)揖赴,也可以理解為關(guān)系型數(shù)據(jù)庫(kù)update語(yǔ)句內(nèi)set后面的內(nèi)容

3)upsert:如果不存在update的紀(jì)錄,是否插入obj這個(gè)新的document抑胎。true為插入,默認(rèn)是false渐北,不插入

4)multi:默認(rèn)是false,只更新找到的第一條紀(jì)錄阿逃,如果為true,按條件查出來的多條紀(jì)錄全部更新。

update方法至少得接收兩個(gè)參數(shù):要修改的對(duì)象(query)和修改后的對(duì)象(obj),而后兩個(gè)參數(shù)它的默認(rèn)值均為false.下面我再來簡(jiǎn)單實(shí)驗(yàn)下,后兩個(gè)參數(shù)的基本用法.

首先說說第四個(gè)參數(shù)multi的作用:默認(rèn)是false,只更新找到的第一條紀(jì)錄赃蛛,如果為true,按條件查出來的多條紀(jì)錄全部更新.

> db.name.update({fname:"jeff"},{$set:{lname:"li"}},false,false)??? #為了讓大家看得清楚點(diǎn),我把后兩個(gè)值都寫了出來,這里可以不用寫的,因?yàn)槟J(rèn)均為false.這里用到了修改器$set,關(guān)于修改器我將在以后介紹

> db.name.find()??? #參數(shù)multi的值是false,只更新找到的第一條紀(jì)錄

{ "_id" : ObjectId("5059221f955cfb1fd75066cb"), "fname" : "jeff", "lname" : "li" }

{ "_id" : ObjectId("5059223a955cfb1fd75066cc"), "fname" : "qiang", "lname" : "he" }

{ "_id" : ObjectId("50592245955cfb1fd75066cd"), "fname" : "deng", "lname" : "pan" }

{ "_id" : ObjectId("50592253955cfb1fd75066ce"), "fname" : "guage", "lname" : "zeng" }

{ "_id" : ObjectId("50592ead955cfb1fd75066cf"), "fname" : "jeff", "lname" : "chen" }

{ "_id" : ObjectId("50592ecb955cfb1fd75066d0"), "fname" : "jeff", "lname" : "zhao" }

{ "_id" : ObjectId("50592edb955cfb1fd75066d1"), "fname" : "jeff", "lname" : "qian" }

> db.name.update({fname:"jeff"},{$set:{lname:"jiang"}},false,true)

> db.name.find()??? #參數(shù)multi的值是true,更新找到的所有紀(jì)錄

{ "_id" : ObjectId("5059221f955cfb1fd75066cb"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("5059223a955cfb1fd75066cc"), "fname" : "qiang", "lname" : "he" }

{ "_id" : ObjectId("50592245955cfb1fd75066cd"), "fname" : "deng", "lname" : "pan" }

{ "_id" : ObjectId("50592253955cfb1fd75066ce"), "fname" : "guage", "lname" : "zeng" }

{ "_id" : ObjectId("50592ead955cfb1fd75066cf"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("50592ecb955cfb1fd75066d0"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("50592edb955cfb1fd75066d1"), "fname" : "jeff", "lname" : "jiang" }

再來看看第三個(gè)參數(shù)upsert的作用:如果不存在update的紀(jì)錄恃锉,是否插入obj這個(gè)新的document。true為插入呕臂,默認(rèn)是false破托,不插入.

> db.name.update({fname:"jeffery"},{$set:{lname:"jiang"}},false,true)

> db.name.find()? #參數(shù)upsert的值是false,不插入

{ "_id" : ObjectId("5059221f955cfb1fd75066cb"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("5059223a955cfb1fd75066cc"), "fname" : "qiang", "lname" : "he" }

{ "_id" : ObjectId("50592245955cfb1fd75066cd"), "fname" : "deng", "lname" : "pan" }

{ "_id" : ObjectId("50592253955cfb1fd75066ce"), "fname" : "guage", "lname" : "zeng" }

{ "_id" : ObjectId("50592ead955cfb1fd75066cf"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("50592ecb955cfb1fd75066d0"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("50592edb955cfb1fd75066d1"), "fname" : "jeff", "lname" : "jiang" }

> db.name.update({fname:"jeffery"},{$set:{lname:"jiang"}},true,true)

> db.name.find()? #參數(shù)upsert的值是true歧蒋,插入.又學(xué)到一種插入數(shù)據(jù)的方法!

{ "_id" : ObjectId("5059221f955cfb1fd75066cb"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("5059223a955cfb1fd75066cc"), "fname" : "qiang", "lname" : "he" }

{ "_id" : ObjectId("50592245955cfb1fd75066cd"), "fname" : "deng", "lname" : "pan" }

{ "_id" : ObjectId("50592253955cfb1fd75066ce"), "fname" : "guage", "lname" : "zeng" }

{ "_id" : ObjectId("50592ead955cfb1fd75066cf"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("50592ecb955cfb1fd75066d0"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("50592edb955cfb1fd75066d1"), "fname" : "jeff", "lname" : "jiang" }

{ "_id" : ObjectId("5059357ad3ba22406ad408e6"), "fname" : "jeffery", "lname" : "jiang" }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末土砂,一起剝皮案震驚了整個(gè)濱河市州既,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萝映,老刑警劉巖吴叶,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異序臂,居然都是意外死亡蚌卤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門奥秆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逊彭,“玉大人,你說我怎么就攤上這事构订〗肓” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵鲫咽,是天一觀的道長(zhǎng)签赃。 經(jīng)常有香客問我,道長(zhǎng)分尸,這世上最難降的妖魔是什么锦聊? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮箩绍,結(jié)果婚禮上孔庭,老公的妹妹穿的比我還像新娘。我一直安慰自己材蛛,他們只是感情好圆到,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卑吭,像睡著了一般芽淡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上豆赏,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天挣菲,我揣著相機(jī)與錄音,去河邊找鬼掷邦。 笑死白胀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抚岗。 我是一名探鬼主播或杠,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼宣蔚!你這毒婦竟也來了向抢?” 一聲冷哼從身側(cè)響起认境,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笋额,沒想到半個(gè)月后元暴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兄猩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年茉盏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枢冤。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸠姨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淹真,到底是詐尸還是另有隱情讶迁,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布核蘸,位于F島的核電站巍糯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏客扎。R本人自食惡果不足惜祟峦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望徙鱼。 院中可真熱鬧宅楞,春花似錦、人聲如沸袱吆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绞绒。三九已至婶希,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間处铛,已是汗流浹背饲趋。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撤蟆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓堂污,卻偏偏與公主長(zhǎng)得像家肯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盟猖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容