mongodb - 将数据从一个集合复制到另一个集合时,MongoDB 中的 _id 字段是否会发生变化?

标签 mongodb mongodb-query mongo-shell

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

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

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

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

(**这只应该在 MongoDB 在复制时从 C1 中的文档中删除 _id 并在插入 C2 时重新生成它们时发生?)

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

谢谢

最佳答案

不,_id 号码不会改变。

当文档 生成一个新的 ObjectId没有 _id 字段被插入到数据库中。当您插入一个已经有 _id 字段的文档时,MongoDB 不会触及它。

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

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

关于mongodb - 将数据从一个集合复制到另一个集合时,MongoDB 中的 _id 字段是否会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24741667/

相关文章:

java - 如何对mongodb中FIND命令获取的文档进行排序?

mongodb查询更新选择嵌套字段

mongodb - Mongodb 将值拆分为 5 分钟间隔并返回间隔组内的最新值

javascript - 如何使用 Javascript 处理 Mongo shell 中文件中的数百万?

node.js - MongoError : there are no users authenticated

mongodb - 使用正则表达式删除 MongoDB 集合

mongodb - 复制并重命名 MongoDB 中的文档字段

MongoDB 错误 : Cannot use 'commands' readMode, 降级到 'legacy' 模式

运行 rs.initiate() 后 mongodb 副本集错误 "...replSetHeartbeat requires authentication..."

javascript - 查询引用文档的字段