mongodb oplog:“插入”操作添加“创建集合”操作吗?

时间:2017-10-16 11:42:44

标签: mongodb mongodb-oplog

当我们插入文档时,如果数据库和/或集合不存在,则在插入之前创建它们。这个“create db / collection”操作是否在oplog中可用?

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

1 个答案:

答案 0 :(得分:1)

是的,插入新集合会在oplog中生成两个条目:

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

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

  3. 回答后续问题:

    official documentation读取:

      

    oplog(操作日志)是一个特殊的上限集合,它保存了所有操作的滚动记录,用于修改存储在数据库中的数据。

    "所有操作"包括创建集合,数据库等。如果主要成员上不存在集合,则在第一次插入时创建它:https://github.com/mongodb/mongo/blob/v3.2/src/mongo/db/catalog/database.cpp#L454

    创建新集合时,相应的文档会记录到oplog:https://github.com/mongodb/mongo/blob/v3.2/src/mongo/db/catalog/database.cpp#L511

    相同的逻辑适用于其他命令,包括create database。

    Format of oplog documents包含重播正确数据库,集合和文档的所有操作的所有必要信息:

    /* 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'
    */