【发布时间】:2017-07-11 21:31:26
【问题描述】:
我的收藏中有大量文档。我想从所有文档中删除自动生成的对象 ID(_id 键)并将其替换为另一个字段作为主键?
我不明白为什么首先需要默认对象 ID?
【问题讨论】:
-
您是在插入新文档还是只是在更新?
-
我想更新文档并向其中添加也具有对象 ID 的子文档。我们可以不删除对象 ID 吗?
标签: mongodb mongodb-query
我的收藏中有大量文档。我想从所有文档中删除自动生成的对象 ID(_id 键)并将其替换为另一个字段作为主键?
我不明白为什么首先需要默认对象 ID?
【问题讨论】:
标签: mongodb mongodb-query
在 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 字段。
来自https://docs.mongodb.com/manual/core/document/#the-id-field:
在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的
_id字段作为主键。如果插入的文档省略了_id字段,MongoDB 驱动程序会自动为_id字段生成ObjectId。
您可以将主键命名为_id。
【讨论】:
_id 设置为我们想要的任何值,但我们不能将_id 更改为student_id?对吗?