How can I specify uniqueness on multiple field in mongo, NOT combined?

时间:2016-06-23 11:40:28

标签: mongodb indexing mongodb-query

I have the following JSON schema in MongoDB:

{"email": "example@gmail.com", "second_email": "example222@gmil.com"}

How can I enforce that both fields will be unique separately AND also be unique between them.

i.e the following document will not be valid:

{"email":"anotherone@gmail.com", "second_email":"example@gmail.com"}

Because example@gmail.com is already exists in another document in the other field.

3 个答案:

答案 0 :(得分:6)

在我的脑海中,没有数据库可以做到这一点(使用另一个列/字段作为唯一性约束的源数据)。您需要对数据进行一些重组以实现此目的。最简单的方法是对数组字段进行唯一约束。

> db.foo.createIndex({ emails: 1 }, { unique: true } )

> db.foo.insert({ emails: ['example@gmail.com', 'example222@gmail.com'] })
WriteResult({ "nInserted" : 1 })
> db.foo.insert({ emails: ['anotherone@gmail.com', 'example@gmail.com'] })
WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 11000,
        "errmsg" : "E11000 duplicate key error index: test.foo.$emails_1 dup key: { : \"example@gmail.com\" }"
    }
})

现在,根据您的应用逻辑,此电子邮件数组甚至可以替换原来的两个字段。或不。由你决定。如果没有,您需要插入原始字段在此数组中复制它们以进行唯一性检查。

答案 1 :(得分:0)

您需要在每个字段上创建一个unique index以强制字段的唯一性。

 $ret = $fb->post('/page_id/feed',$params,  $pageaccesstoken );

话虽如此,MongoDB并没有提供一种方法来强制同一文档中两个字段的唯一性。您需要在应用程序中使用 if / else 语句执行此操作。

answer here中显示的另一个选项是,如果您不想多次调用createIndex()方法,请使用索引数组字段。但是,如果您不希望数组中出现重复值,则仍需要使用逻辑条件处理。

答案 2 :(得分:0)

db.collection.createIndex( { "mails.email": 1, "mails.second_email": 1 }, { unique: true } )

db.collection.insert( { _id: 3, mails: [ { email: "example@gmail.com", second_email: "example222@gmil.com" } ] } )

现在您创建了一个“电子邮件-第二封电子邮件”对组合,以强制这两个字段唯一。

此外,如果您使用批量选项,则可以将order设置为false,以在失败时继续剩余的插入。.insertMany({},{ordered:false})