我有一个字段为“email”和“friends_email”的集合。我想使用MongoDB设置一个像下面这样的唯一约束:
没有记录对email和friends_email具有相同的值。所以这将是无效的:
{"email": "abc@example.com", "friends_email": "abc@example.com" }
没有2条记录对所有字段都具有相同的值。因此,以下示例将全部无效:
{
{ "email": "abc@example.com", "friends_email": "def@example.com" },
{ "email": "abc@example.com", "friends_email": "def@example.com" }
}
{
{ "email": "abc@example.com", "friends_email": null },
{ "email": "abc@example.com", "friends_email": null }
}
{
{ "email": null, "friends_email": "abc@example.com" },
{ "email": null, "friends_email": "abc@example.com" }
}
简单地说,email
和friends_email
的串联将是唯一的,null
和undefined
合并为空字符串。
在MongoDB中强制执行此规则的最佳方法是什么?
答案 0 :(得分:35)
听起来你需要一个复合唯一索引:
db.users.createIndex( { "email": 1, "friends_email": 1 }, { unique: true } )
...您可以在ORM层验证email = / = friends_email。
答案 1 :(得分:5)
您可以在email
和friends_email
字段上添加复合唯一索引,以确保第二种情况。但是对于第一种情况,您需要在应用程序代码中处理它,或者使用诸如Morphia之类的Java映射器来进行基于字段的验证。您可能还想检查以下帖子:
答案 2 :(得分:3)
对于第二种情况,是您正在寻找的独特复合指数?
db.emails.ensureIndex( {email:1, friends_email:1}, { unique: true } )
至于第一种情况,我不确定是否有办法强制执行第一条规则。您可能需要在应用程序端执行检查。
答案 3 :(得分:0)
对于 #1,您可以使用 Schema Validaiton 在数据库端设置检查:
validator: {
"$expr": {
"$ne": [ "$email", "$friends_email" ]
}
}
db.runCommand( { collMod: "collectionName", validator: validator} )