对任意字段的唯一约束
在此页面上
如果无法使用唯一字段作为分分片键,或者需要实施多个字段的唯一性,则必须创建另一个集合作为“代理集合”。 该集合必须包含对原始文档(即其 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 在插入文档时自动创建。
如果需要对多个字段强制实施唯一性,则每个字段都需要自己的代理集合。
Considerations
您的应用程序必须在将文档插入“代理”集合时捕捉错误,必须强制两个集合保持一致。
如果代理集合需要分片,则必须对要强制唯一性的单个字段进行分片。
要使用分片代理集合强制多个字段的唯一性,必须为每个要强制唯一性的字段设置一个代理集合。如果在单个代理集合上创建多个唯一索引,就无法对代理集合进行分片。