我正在转换我的Rails应用程序以通过mongoid使用mongodb。我有两个与索引有关的问题。我想我知道答案,但我希望得到mongodb有更多经验的人的确认。
让我们看一下以下示例,其中Users
和Posts
之间存在一个关系关联。
user.rb
class User
has_many_related :posts
end
post.rb
class Post
belongs_to_related :user
end
现在,当我查看通过MongoHQ界面创建的索引时,我注意到以下两点:
键名:_id_
索引字段:_id
独特:<blank>
ID保证是唯一的吗?如果是这样,为什么不是唯一的设置。如果没有,我该怎么设置呢?我需要吗?
键名:user_id_1
索引字段:user_id
独特:false
假设索引字段是集合中的字段名称,我是否正确?只想确认密钥名称后面有_1
。
答案 0 :(得分:3)
是的,MongoDB中的_id
始终是唯一的。这是主键,这就是为什么不需要设置UNIQUE
。
答案 1 :(得分:2)
以下是MongoDB Indexing Overview中非常清楚描述的索引。
_id
_id索引是_id字段上的唯一索引**,MongoDB默认在所有集合上创建此索引。您无法删除_id上的索引。
_id字段是集合的主键,每个文档都必须具有唯一的_id字段。您可以在_id字段中存储任何唯一值。 _id的默认值是每个insert()上的ObjectID
**虽然_id上的索引是唯一的,但getIndexes()方法不会在mongo shell中打印unique:true。
答案 2 :(得分:1)
如果未在MongoDB中手动指定_id值,则该类型将设置为由12字节二进制值组成的特殊BSON数据类型。
12字节值由4字节时间戳,3字节机器ID,2字节进程ID和3字节计数器组成。由于这种设计,这个值具有很高的独特概率。
参考:MongoDB权威指南:云计算和桌面计算的NoSQL数据库(书)