MongoDB中两个字段的唯一约束

时间:2013-02-04 18:06:25

标签: mongodb

我有一个字段为“email”和“friends_email”的集合。我想使用MongoDB设置一个像下面这样的唯一约束:

  1. 没有记录对email和friends_email具有相同的值。所以这将是无效的:

    {"email": "abc@example.com", "friends_email": "abc@example.com" }
    
  2. 没有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" }
    }
    

    简单地说,emailfriends_email的串联将是唯一的,nullundefined合并为空字符串。

  3. 在MongoDB中强制执行此规则的最佳方法是什么?

4 个答案:

答案 0 :(得分:35)

听起来你需要一个复合唯一索引:

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

...您可以在ORM层验证email = / = friends_email。

答案 1 :(得分:5)

您可以在emailfriends_email字段上添加复合唯一索引,以确保第二种情况。但是对于第一种情况,您需要在应用程序代码中处理它,或者使用诸如Morphia之类的Java映射器来进行基于字段的验证。您可能还想检查以下帖子:

  

How to apply constraints in MongoDB?

答案 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} )