将数据从一个集合复制到另一个集合时,_id字段是否会在MongoDB中更改?

时间:2014-07-14 16:51:40

标签: mongodb mongodb-query mongo-shell

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

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

但是,如果有另一种复制文档的方式,_id可能会因为它取决于以下方式而改变:

(1)UNIX时间戳 (2)机器标识符 (3)ProcessId

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

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

由于

1 个答案:

答案 0 :(得分:7)

不,_id数字不会改变。

当文档不带 _id字段插入数据库时​​,会生成新的ObjectId。当您插入已有_id字段的文档时,MongoDB将不会触及它。

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

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