MongoDB修改數(shù)據(jù)update和save方法-創(chuàng)新互聯(lián)

   前面我簡單介紹了下MongoDB怎樣插入數(shù)據(jù).那么數(shù)據(jù)插入到數(shù)據(jù)庫中,就可能會修改數(shù)據(jù).在MongoDB中,它提供了修改數(shù)據(jù)的方法:update.下面,我來簡單說下update的使用方法.
首先,我們操作的數(shù)據(jù)都存放在test數(shù)據(jù)庫中的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ù).在前面的插入中,我說過,插入時可以以文檔的的方式插入,也可以先把文檔賦值給變量,再以變量的方式插入.update方法也可以用這兩種方式.我先用文檔的方式來修改集合中的第二條記錄,命令如下:
> db.name.update({"_id" : ObjectId("5059223a955cfb1fd75066cc")},{"fname" : "qiang", "lname" : "he"})
> db.name.find()   #檢查發(fā)現(xiàn),數(shù)據(jù)修改過來了,和預期的結(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" }
我們再用變量的方式來修改該集合中的第三條記錄.首先將它找出來賦值給變量someone:
> someone=db.name.findOne({"_id" : ObjectId("50592245955cfb1fd75066cd")})
{
   "_id" : ObjectId("50592245955cfb1fd75066cd"),
   "fname" : "dengdeng",
   "lname" : "pan"
}
重新賦值你要修改的內(nèi)容來修改變量someone的值:
> someone.fname="deng"
deng
用修改過的變量替換之前文檔的位置來達到修改數(shù)據(jù)的目的:
> db.name.update({"_id" : ObjectId("50592245955cfb1fd75066cd")},someone)
> db.name.find()   #檢查發(fā)現(xiàn),數(shù)據(jù)修改過來了,和預期的結(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ù)實際就是根據(jù)參數(shù)條件,調(diào)用了insert或update函數(shù).那么save方法是否也能實現(xiàn)數(shù)據(jù)的修改操作呢?下面我們來實驗一下.首先還是以文檔的方式來進行修改操作:
> db.name.save({"_id" : ObjectId("50592253955cfb1fd75066ce")}, {"fname" : "dongren", "lname" : "zeng"})
> db.name.find()   #檢查發(fā)現(xiàn),數(shù)據(jù)修改過來了,但和預期的結(jié)果不一樣,跟之前插入數(shù)據(jù)一樣,save方法也同樣將第二個參數(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ù)修改過來了,和預期的結(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ù)修改過來了,和預期的結(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這兩方法的具體實現(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語句內(nèi)where后面的內(nèi)容
       2)obj:update的對象和一些更新的操作符(如$、$inc等),也可以理解為關系型數(shù)據(jù)庫update語句內(nèi)set后面的內(nèi)容
       3)upsert:如果不存在update的紀錄,是否插入obj這個新的document。true為插入,默認是false,不插入
       4)multi:默認是false,只更新找到的第一條紀錄,如果為true,按條件查出來的多條紀錄全部更新。

  update方法至少得接收兩個參數(shù):要修改的對象(query)和修改后的對象(obj),而后兩個參數(shù)它的默認值均為false.下面我再來簡單實驗下,后兩個參數(shù)的基本用法.
  首先說說第四個參數(shù)multi的作用:默認是false,只更新找到的第一條紀錄,如果為true,按條件查出來的多條紀錄全部更新.
> db.name.update({fname:"jeff"},{$set:{lname:"li"}},false,false)   #為了讓大家看得清楚點,我把后兩個值都寫了出來,這里可以不用寫的,因為默認均為false.這里用到了修改器$set,關于修改器我將在以后介紹
> db.name.find()   #參數(shù)multi的值是false,只更新找到的第一條紀錄
{ "_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,更新找到的所有紀錄
{ "_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" }
再來看看第三個參數(shù)upsert的作用:如果不存在update的紀錄,是否插入obj這個新的document。true為插入,默認是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,插入.又學到一種插入數(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" }

update方法操作其實還是有點復雜的,這里我只簡單地介紹了下它的基體操作,復雜的操作是合理利用各種修改器,以達到更高效更方便的管理.關于修改器的使用,我將在以后實驗.

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

成都創(chuàng)新互聯(lián)專注于陽朔企業(yè)網(wǎng)站建設,響應式網(wǎng)站,商城網(wǎng)站開發(fā)。陽朔網(wǎng)站建設公司,為陽朔等地區(qū)提供建站服務。全流程按需定制制作,專業(yè)設計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務

當前名稱:MongoDB修改數(shù)據(jù)update和save方法-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://muchs.cn/article32/dhsjsc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供標簽優(yōu)化、網(wǎng)站收錄、域名注冊全網(wǎng)營銷推廣、網(wǎng)站改版、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作