将 _id 从 ObjectId 更改为正常的唯一自动增量整数

Posted

技术标签:

【中文标题】将 _id 从 ObjectId 更改为正常的唯一自动增量整数【英文标题】:Change _id from ObjectId to normal unique auto increment integer 【发布时间】:2022-01-19 01:48:00 【问题描述】:

我对 Django 和 Web 开发还很陌生,所以所有这些对我来说都是新的,因为我正在学习。

我最近有一个 Django 站点设置并使用 Postgresql。当我创建它时,我把事情复杂化了,需要特别使用 Postgresql,因为它有一个 SQLite 没有的字段。无论如何,我将重做它(v2)并想转换为 MongoDB。现在我已经设置好了所有东西,但是我注意到当我在管理面板中从我的模型创建新项目时,它会在数据库中获得_id:ObjectId("61ba69238db76b91b4bf42f1")。我猜这是主键?但是,据我了解,Django 正在寻找一个正常的整数值。因此,当我尝试删除或修改内容时,它会给我一个错误:Field 'id' expected a number but got 'None'.

我应该为每个模型创建自己的“id”字段吗?应该/可以使用默认的_id 字段吗?

谢谢!

【问题讨论】:

id_id 字段不一样。也许您需要在创建记录时添加 id 字段? 【参考方案1】:

在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id 充当主键的字段。

The _id field docs.

“_id”字段始终在 mongo 集合中。如果您没有像这样在模型中明确提供“_id”字段:

_id = djongo_models.ObjectIdField()

那么您无法从 djongo 查询它。 如果您没有提供任何标记为 primary_key 的字段,那么 djongo 会帮助您并为您提供

id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')

您可以在迁移文件中检查它。 Djongo 还为该字段创建了唯一索引。所以你最终会得到两个唯一索引,一个是“_id”,它是 bson ObjectId,第二个是“id”,它将是一个序列整数。 如果您在幕后添加了自动字段“id”或 djongo,您应该能够按“id”过滤,例如:

YourModel.objects.filter(id=1).delete()

所以你不需要添加“id”字段,djongo 会为你做的。 并且“_id”字段将始终在 mongo 集合中,您可以忽略它或将其添加到模型中,然后使用它(查询)。

【讨论】:

以上是关于将 _id 从 ObjectId 更改为正常的唯一自动增量整数的主要内容,如果未能解决你的问题,请参考以下文章

使用 java 在 Micronaut 中将 MongoDb ObjectId _id 更改为字符串

将猫鼬列从对象更改为 ObjectId

如何将猫鼬模式从唯一的 true 更改为唯一的 false

使用聚合更改集合中记录的值

MongoDB,将对象数组更改为包含其 ObjectId 的字符串数组

mongodb中的_id的ObjectId的生成规则