mongodb组合领域独特

时间:2016-05-28 19:41:34

标签: mongodb indexing

我需要确保某些字段的组合是唯一的,所以我发现我们可以使用索引来实现它,例如:

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问题。谢谢提前

0 个答案:

没有答案