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