30

我有一个包含“电子邮件”和“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" }
    }
    

    用简单的英语来说,它类似于emailand的连接friends_email将是唯一的,null并且undefined合并为空字符串。

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

4

4 回答 4

52

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

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

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

于 2013-02-04T18:50:04.823 回答
8

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

如何在 MongoDB 中应用约束?

于 2013-02-04T18:49:34.847 回答
7

对于第二种情况,您正在寻找一个独特的复合索引吗?

 db.emails.ensureIndex( {email:1, friends_email:1}, { unique: true } )

至于第一种情况,我不确定是否有办法执行第一条规则。您可能需要在应用程序端执行检查。

于 2013-02-04T18:53:17.947 回答
0

对于#1,您可以使用Schema Validaiton在数据库端设置检查:

validator: {
  "$expr": {
    "$ne": [ "$email", "$friends_email" ]
  }
}

db.runCommand( { collMod: "collectionName", validator: validator} )
于 2021-05-13T14:20:39.850 回答