mongodb指南(翻譯)(八) – developer zone – 資料庫之命令(三)

來源:互聯網
上載者:User
getLastError命令

當向資料庫寫入時,mongodb預設不等待響應訊息。使用getLastError命令來確保操作已經正確執行。

在很多驅動中當你使用"安全"模式(一些驅動中稱為“set write concern”)進行儲存和更新時,getLastError命令會自動調用。但是當這個特別的被稱為getlasterror的命令被調用時,實際上又發生什麼了呢。這裡,我們介紹它怎麼工作。

在shell中運行

getlasterror命令檢查本串連的上一次資料庫操作的錯誤。由於它是一個命令,這裡有一些方法可以使用它:

> db.$cmd.findOne({getlasterror:1})

或者在shell中:

> db.runCommand("getlasterror")

或者使用shell助手:

> db.getLastError()

在mongo shell,db.getLastError()返回上一次錯誤-如果沒有錯誤則為空白。使用db.getLastErrorObj()查看完整的錯誤結果。

在沒有錯誤的情況下,db.getLastErrorObj().err應該為空白。

什麼時候用

getlasterror主要對寫操作有用(雖然它也在一個命令或者查詢後面設定了)。寫操作預設不會有返結果:這樣就節約了用戶端在寫操作時等待用戶端/伺服器之間往返時間。如果有人需要一個返回結果,那麼他可以始終調用getLastError.

如果你在多個串連上面向mongodb寫資料,那麼有時候在一個串連上調用getlasterror來確認資料已經提交到了資料庫是很重要的。舉個例子,如果你向串連#1寫入資料並希望這些寫入可以反映到串連#2上面的讀操作,你可以在向串連#1寫入後調用getlasterror來確保這一點。

為了最大化的速度,對於不重要的寫入跳過使用getLastError(或者"safe mode")。在需要向使用者確認寫操作成功時使用它。

選項

fsync

當沒有使用日誌功能運行mongod(--nojournal)時,同步的選項強制資料庫在同步完所有檔案後才返回。

當使用日誌功能運行mongod,同步選項等待下一次組提交後才返回。

> db.runCommand({getlasterror:1,fsync:true})
{ "err" : null, "n" : 0, "fsyncFiles" : 2, "ok" : 1 }

j

v2.0+:當設定j:true時,getlasterror調用等待日誌提交後才返回。如果伺服器沒有啟用日誌功能,它立即返回,並且成功。

> db.runCommand({getlasterror:1,j:true})

w

用戶端可以阻塞直到一個寫操作被複製到N個伺服器。

wtimeout可以聯合w一起使用。預設是沒有逾時(永久等待)。

> db.getLastError(2, 5000) // w=2, timeout 5000ms

注意上面的這些選項可以聯合使用:等待日誌確認和寫操作到達複製組中多數節點的確認是有意義的。

標誌和多數

mongodb2.0有能力控制那些節點被寫入。代替設定寫操作必須被公認的節點個數的方法,你可以在配置中設定基於標誌的規則。

除了標誌規則外,你還可以設定一個字串“majority”:

>db.getLastError("majority") // waits for more than 50% of the configured nodes to acknowledge the
write (until replication is applied to the point of that write)

傳回值

這個命令的傳回值是一個多欄位的對象。常用的欄位已經列在下面;這裡可能還有其他欄位。

  • ok - 為真的話表示getLastError命令成功完成了。它並不表示上一次沒有錯誤。
  • err - 如果非空,表示有錯誤出現。值是一個錯誤本文的描述。
  • code - 如果設定了,表示出現的錯誤碼。
  • connectionId - 串連的id。
  • lastOp - 上一次操作的op-id

對於更新:

  • n - 如果一次更新完成了,它是更新的文檔個數。

使用了w:<n>/<tag>

  • wnote - 如果設定了,表示這裡有些不尋常的事情發生,涉及使用w:
  • wtimeout - 如果逾時了,設定該值為真
  • waited - 如果逾時了,標記等到了多久,單位毫秒
  • wtime - 花在等待操作完成的時間

在驅動中使用getLastError

驅動支援命令格式使用getLastError並且很多還為操作提供了"safe"模式。查閱各驅動的文檔擷取更多關於"safe"模式的資訊。

mongo shell REPL 行為

資料庫shell在每一次read/eval/print loop命令計算前會執行resetError() - 並且自動列印錯誤,如果每一次計算髮生了一個錯誤。所以,在一個錯誤之後,在shell提示符調用db.getLastError()會返回空。儘管如此,如果在返回到提示符前調用,結果會是你期望的:

> try { db.foo.findOne() } catch(e) { print("preverr:" + tojson(db.getPrevError())); print("lasterr:"
+ tojson(db.getLastError()));}
preverr:{"err" : "unauthorized" , "nPrev" : 1 , "ok" : 1}
lasterr:"unauthorized"

getPrevError命令

當執行大量寫操作時,resetError()和getPrevError()會是一個檢查操作是否成功的高效的方法。

例如我們要插入1000個對象到一個整合,通過網路檢查1000次得傳回值會很慢。相反,你可以像這樣做些事情:

db.resetError();
for( loop 1000 times... )
db.foo.save(something...);
if( db.getPrevError().err )
print("didn't work!");
索引相關的命令

建立索引

ensureIndex()是建立索引的助手函數。它的執行會建立一個索引通過將索引資訊加入到集合system.indexes中。

> use test
> db.myCollection.ensureIndex(<keypattern>);
> // same as:
> db.system.indexes.insert({ name: "name", ns: "namespaceToIndex",
key: <keypattern> });

注意:一旦你插入了索引,所有後續插入的文檔都會被索引,就像集合中已經存在的文檔一樣。如果你有一個很大的集合,這會佔用大量時間並且會阻塞其他動作。

你可以查詢資料庫test的集合foo中的system.indexes來查看所有索引:

>db.system.indexes.find( { ns: "test.foo" } );

在一些驅動中,ensureIndex()記得它近期是否被調用過,並放棄在這種情況下的索引插入操作。即使不是這種情況,ensureIndex()是一個輕負擔操作,它可以被經常調用以確保這個索引存在。

丟棄一個索引

從shell中:

db.mycollection.dropIndex(<name_or_pattern>)
db.mycollection.dropIndexes()
// example:
t.dropIndex( { name : 1 } );

從一個驅動中(原始命令對象格式;很多驅動有助手函數):

{ deleteIndexes: <collection_name>, index: <index_name> }
// "*" for <index_name> will drop all indexes except _id

重索引

重索引命令會對一個集合中的所有索引進行重建:

db.myCollection.reIndex()
// same as:
db.runCommand( { reIndex : 'myCollection' } )

通常這是不需要的。你可能希望去重索引,當你的集合發生了顯著的變化或者索引佔用的磁碟空間出奇的大的時候。
自1.8版本開始索引在更新時會自動被壓縮。

重索引是一個阻塞操作(索引在前天被重建)並且對於大的集合會很慢。

修複資料庫命令會重建資料庫中所有的索引。

索引命名空間

每一個索引擁有自己的命名空間用於btree儲存段。這個命名空間是:

<collectionnamespace>.$<indexname>

這是一個內部的不能被直接查詢的命名空間。

 

 

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.