0

当我们插入一个文档时,如果数据库和/或集合不存在,它们会在插入之前创建。oplog 中是否提供此“创建数据库/集合”操作?

我感兴趣的原因是因为我们想从 v2.4 升级到 v3.2 但根据https://jira.mongodb.org/browse/SERVER-17634,“applyOps”命令将在插入操作时失败如果集合丢失。

4

1 回答 1

1

是的,插入新集合会在 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

创建新集合时,对应的文档记录到 oplog 中: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'
*/
于 2017-10-16T13:47:47.300 回答