【问题标题】:Does _id field change in MongoDB when copying data from one collection to another?将数据从一个集合复制到另一个集合时,MongoDB 中的 _id 字段是否会更改?
【发布时间】:2014-09-04 16:08:30
【问题描述】:

我们计划使用 MongoDB _id 作为我们将提供给客户的密钥。因此,要求是如果我们需要将数据从一个集合移动到另一个集合,则该键不应更改。将使用 db.copyDatabase() 或 mongoimport 执行复制。

将数据从一个集合复制到另一个集合的方法之一是遍历第一个集合 (C1) 中的文档并将这些文档插入到第二个集合 (C2) 中。在这种情况下,_id 应该保持不变(在 C2 中),因为它会出现在插入的文档(C1 的)中(与我们自己提供 _id 的情况相同)。

但是,如果有其他复制文档的方式,_id 可能会改变,因为它取决于:

(1) UNIX 时间戳 (2) 机器标识符 (3) 进程号

(**只有在复制时 MongoDB 从 C1 中的文档中删除 _id 并在插入 C2 时重新生成它们时才会发生这种情况?)

无论目标集合的位置如何,我们都希望 _id 值相同: (1)在同一个数据库中 (2)不同的数据库-同一台机器 (3)不同的数据库-不同的机器)

谢谢

【问题讨论】:

    标签: mongodb mongodb-query mongo-shell


    【解决方案1】:

    不,_id 数字不会改变。

    没有 _id 字段的文档插入数据库时​​,会生成一个新的 ObjectId。当你插入一个已经有 _id 字段的文档时,MongoDB 不会去触碰它。

    时间戳、机器标识符和 processID 是指生成 ObjectID 的那些。这可以是数据库服务器,但也可以由应用服务器上的 MongoDB 驱动程序生成。在这种情况下,MongoDB 不会自行更改它。

    顺便说一句:_id 可以是自动生成的 ObjectId,但不是必须的。您也可以使用任何其他值作为 _id,只要您可以保证它是唯一的。所以当你的数据已经有一个自然键时,你可以在需要时将其用作_id。

    【讨论】:

    • 好答案。最后一句应该是 _id 而不是 ObjectId 吗?
    猜你喜欢
    • 2023-01-10
    • 2015-09-14
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2014-09-16
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多