Docs 菜单

Docs 主页开发应用程序MongoDB Manual

对任意字段的唯一约束

在此页面上

  • 考虑因素

如果不能使用唯一字段作为分片键,或者需要实施针对多个字段的唯一性,则必须创建另一个集合作为“代理集合”。这个集合必须包含对原始文档的引用(即其 ObjectId)和唯一键。

请考虑一个存储用户信息的集合 records。字段 email 不是分片键,但必须是唯一的。

这样一来,proxy 集合就包含了以下内容:

{
"_id" : ObjectId("...")
"parent_id" : "<ID>"
"email" : "<string>"
}

使用以下命令,为 email 字段创建唯一索引:

db.proxy.createIndex( { "email" : 1 }, { unique : true } )

下面的示例首先尝试将包含目标字段和生成的唯一 ID 的文档插入到 proxy 集合中。如果操作成功,就会将完整文档插入 records 集合。

records = db.getSiblingDB('records');
proxy = db.getSiblingDB('proxy');
var primary_id = ObjectId();
proxy.insertOne({
"_id" : primary_id
"email" : "example@example.net"
})
// if: the above operation returns successfully,
// then continue:
records.insertOne({
"_id" : primary_id
"email": "example@example.net"
// additional information...
})

请注意,这种方法需要为 primary_id 字段创建唯一 ID,而不是让 MongoDB 在插入文档时自动创建。

如果需要对多个字段强制实施唯一性,则每个字段都需要自己的代理集合。

提示

请参阅:

完整的文档:createIndex()shardCollection

  • 您的应用程序必须在将文档插入“代理”集合时捕捉错误,必须强制两个集合保持一致。

  • 如果代理集合需要分片,则必须对要强制唯一性的单个字段进行分片。

  • 要使用分片代理集合强制多个字段的唯一性,必须为每个要强制唯一性的字段设置一个代理集合。如果在单个代理集合上创建多个唯一索引,就无法对代理集合进行分片。

MongoDB 是什么? →

在此页面上