我的文档中有一个int
类型的唯一ID字段。我在这个字段上正在ensureIndex
,但我的文档仍然包含_id
。我可以摆脱它吗?
答案 0 :(得分:4)
来自docs ...
如果用户尝试在不提供_id字段的情况下插入文档, 数据库将自动生成对象ID 并存储它 _id字段。
但是,您可以将自己的值分配给 _id ...
_id值可以是除数组之外的任何类型,只要它是 一个独特的。
更好的问题是,为什么要创建自己的唯一ID,在其上构建索引并删除自动编入索引的非常有用的ObjectID _id ?
所有官方驱动程序都使用ObjectID,它有很多非常好的方面:
内置时间戳(因此您无需存储日期字段 在您的文档中,您可以使用它按日期订购。)
这是一个“全局的,统一增加的序列号”---即 如果您需要对数据进行分片,它在服务器上仍然是唯一的, 等
答案 1 :(得分:2)
不,您无法摆脱它,it is there by design,但您可以在插入文档时将您的唯一标识符int
映射到_id
。
答案 2 :(得分:2)
一个好主意是将您的哈希存储到_id字段中。
因此,数据库不会自动创建_id字段,因为它已经存在,您将保存未使用索引的空间。
只需将_id字段设置为具有所需值的任何其他字段(例如,哈希)。但要小心,它必须是独一无二的!
要确保单一性,您应该将其设为唯一或将子文档放在_id字段中: {_id:{h:[yourHash],u:[唯一标识符}},...}