【问题标题】:How to remove _id in MongoDB and replace with another field as a Primary Key?如何在 MongoDB 中删除 _id 并替换为另一个字段作为主键?
【发布时间】:2017-07-11 21:31:26
【问题描述】:

我的收藏中有大量文档。我想从所有文档中删除自动生成的对象 ID(_id 键)并将其替换为另一个字段作为主键?

我不明白为什么首先需要默认对象 ID?

【问题讨论】:

  • 您是在插入新文档还是只是在更新?
  • 我想更新文档并向其中添加也具有对象 ID 的子文档。我们可以不删除对象 ID 吗?

标签: mongodb mongodb-query


【解决方案1】:

在 mongodb 中,每个文档都必须是唯一的,因此您需要一个唯一的字段来用作 id。如果您不提供,mongodb 会自动为您提供。但是,如果您想出于任何原因提供自定义 ID(提高查询性能是其中之一),您可以手动进行。以下是我的建议:

如果要插入新文档,可以手动设置 _id 字段,如:

doc._id = "12312312" //(Or whichever function to generate id you have)
doc.save(...)

但是当你已经在数据库中有一个文档时,你不能再修改它了。您可以做的是制作文档副本,使用相同数据保存新文档并删除旧文档:

// Fetch the documents
docs = db.clients.find({})

docs.forEach((doc) => {
   //For each field you copy the values
   new_doc.field = doc.field
   new_doc._id = //YOUR ID FUNCTION 

   // insert the document, using the new _id
   db.clients.insert(new_doc)

   // remove the document with the old _id
   db.clients.remove({_id: doc._id})
}

这个问题和下面的问题类似:

How update the _id of one MongoDB Document?

希望我的回答对你有帮助

【讨论】:

  • 这没有回答问题。问题是是否可以删除 _id 字段并使用另一个字段作为主键,而不是更改 _id 值。
【解决方案2】:

无法删除_id 字段。

来自https://docs.mongodb.com/manual/core/document/#the-id-field

在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id 字段作为主键。如果插入的文档省略了_id 字段,MongoDB 驱动程序会自动为_id 字段生成ObjectId

您可以将主键命名为_id

【讨论】:

  • 如果我理解正确,我们可以将_id 设置为我们想要的任何值,但我们不能将_id 更改为student_id?对吗?
  • 这个答案需要通过链接来确认......因为如果我想要另一个自定义键,Mongo必须让我们更改默认主节点,主要是为了避免索引重复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
相关资源
最近更新 更多