簡體   English   中英

mongodb oplog:“插入” op是否添加“創建集合” op?

[英]mongodb oplog: does “insert” op add “create collection” op?

當我們插入文檔時,如果數據庫和/或集合不存在,則會在插入之前創建它們。 oplog中是否提供此“創建數據庫/收集”操作?

我感興趣的原因是因為我們想從v2.4升級到v3.2,但是根據https://jira.mongodb.org/browse/SERVER-17634 ,在插入操作時“ applyOps”命令將失敗如果缺少集合。

是的,插入新集合會在oplog中產生2個條目:

  1. {op: "c", o: {create: "name_of_the_collection"}}創建集合

  2. {op: "i", ns: "name_of_the_collection", o:{the document}}插入文檔

回答后續問題:

官方文檔顯示:

oplog(操作日志)是一個特殊的,有上限的集合,該記錄保持所有修改存儲在數據庫中的數據的操作的滾動記錄。

“所有操作”包括創建集合,數據庫等。如果集合在主要成員上不存在,則在首次插入時創建: https//github.com/mongodb/mongo/blob/v3.2/src/mongo/db/目錄/ database.cpp#L454

創建新集合時,相應的文檔記錄到操作日志中: https : //github.com/mongodb/mongo/blob/v3.2/src/mongo/db/catalog/database.cpp#L511

相同的邏輯適用於其他命令,包括創建數據庫。

oplog文檔的格式包含所有必要的信息,以重放對正確的數據庫,集合和文檔的所有操作:

/* we write to local.oplog.rs:
     { ts : ..., h: ..., v: ..., op: ..., etc }
   ts: an OpTime timestamp
   h: hash
   v: version
   op:
    "i" insert
    "u" update
    "d" delete
    "c" db cmd
    "db" declares presence of a database (ns is set to the db name + '.')
    "n" no op
   bb param:
     if not null, specifies a boolean to pass along to the other side as b: param.
     used for "justOne" or "upsert" flags on 'd', 'u'
*/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM