我需要确保某些字段的组合是唯一的,所以我发现我们可以使用索引来实现它,例如:
db.user.ensureIndex({'fname':1,'lname':1},{unique:true})
然而,在我的场景中,我允许用户添加电子邮件或电话,甚至两者。那么我如何在这种情况下实现独特性。我尝试设置2索引像
db.user.ensureIndex({'fname':1,'lname':1,'email':1},{unique:true})
并且
db.user.ensureIndex({'fname':1,'lname':1,'mobile':1},{unique:true})
当我尝试添加带有唯一电子邮件的文档时,这种工作正常工作,如下所示
> db.user.insert({fname:'tony',lname:'stark',email:'aa@gmail.com'})
WriteResult({ "nInserted" : 1 })
> db.user.insert({fname:'tony',lname:'stark',email:'xyz@gmail.com'})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error index: temp.user.$fname_1_lname_1_mobile_1 dup key: { : \"tony\", : \"stark\", : null }"
}
})
我猜错误是因为第二个索引,因为两个插入都具有移动字段的空值。然后我尝试了这个
db.user.ensureIndex({'fname':1,'lname':1,'email':1,'mobile':1},{unique:true})
那个dint有帮助,有没有办法用mongodb做这个或者用代码检查唯一性。
更新 在这种情况下我也需要确保唯一性:
db.user.insert({fname:'tony',lname:'stark',email:'abc@gmail.com'})
<<insert>>
db.user.insert({fname:'tony',lname:'stark',email:'abc@gmail.com',mobile:554545435})
<<dont insert>>
更新2 甚至独特的部分指数也无济于事
> db.users.createIndex({ "fname": 1, "lname": 1, "email":1 },
... { unique: true, partialFilterExpression:{
... email: { $exists: true, $gt : { $type : 10 } } } })
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.users.createIndex({ "fname": 1, "lname": 1, "mobile":1 },
... { unique: true, partialFilterExpression:{
... mobile: { $exists: true, $gt : { $type : 10 } } } })
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
以下是查询:
>db.users.insert({fname:"tony",lname:"stark",mobile:"123",email:"123@gmail.com"})
WriteResult({ "nInserted" : 1 })
>db.users.insert({fname:"tony",lname:"stark",mobile:"123",email:"123@gmail.com"})
WriteResult({ "nInserted" : 1 })
Mongo版本 - v3.2.0
我没有使用mongodb的经验很多都没有在其他数据库中使用索引,我想这是一个noob问题。谢谢提前