【发布时间】:2020-11-06 06:47:45
【问题描述】:
考虑一个包含以下文档的集合:
{
name: "John Doe",
emails: [
{
value: "some@domain.com",
isValid: true,
isPreferred: true
}
]
},
{
name: "John Doe",
emails: [
{
value: "john.doe@gmail.com",
isValid: false,
isPreferred: false
},
{
value: "john.doe@domain.com",
isValid: true,
isPreferred: true
}
]
}
应该没有用户拥有相同的有效和首选电子邮件,因此有一个唯一索引:
db.users.createIndex( { "emails.value": 1 }, { name: "loginEmail", unique: true, partialFilterExpression: { "emails.isValid": true, "emails.isPreferred": true } } )
将以下电子邮件添加到第一个文档会触发违反唯一约束:
{
name: "John Doe",
emails: [
{
value: "john.doe@gmail.com",
isValid: false,
isPreferred: false
}
]
}
原因:com.mongodb.MongoCommandException:命令失败 error 11000 (DuplicateKey): 'E11000 重复键错误收集: profile.users 索引:loginEmail 复制键:{ emails.value: “john.doe@gmail.com”,emails.isValid:假,emails.isPreferred:假 }' 在服务器配置文件-db-mongodb.dev:27017 上。完整的回应是 {"ok": 0.0, "errmsg": "E11000 重复键错误收集: profile.users 索引:loginEmail 复制键:{ emails.value: “john.doe@gmail.com”,emails.isValid:假,emails.isPreferred: 假}”,“代码”:11000,“代码名称”:“DuplicateKey”,“keyPattern”: {“emails.value”:1,“emails.isValid”:1,“emails.isPreferred”:1}, “keyValue”:{“emails.value”:“john.doe@gmail.com”,“emails.isValid”: false, "emails.isPreferred": false}}
据我所知,这是因为过滤器表达式应用于集合,而不是嵌入文档,因此尽管有点违反直觉和意外,但索引的行为与描述的一样。
我的问题是如何确保部分唯一性而不会出现误报?
【问题讨论】:
标签: database mongodb indexing nosql unique-constraint