2017-01-23 21 views
0

我有對象的結構集合,像這樣:上的對象數組不靈獨特partialFilterExpression指數

{ 
    emails: [{email:"[email protected]", type: "work"}], 
    _companyId: "FLEHFHOIEFHOIHEFHL" 
} 

我想創建一個唯一索引,這樣的emails_companyId組合是唯一的。我只是做一個簡單的複合索引,但是當我保存兩個沒有電子郵件的人時,它會在第二個引發錯誤,因爲它沒有索引emails.email字段的值,只在索引中留下_companyId,這會引發一個重複鍵錯誤,當我嘗試插入第二個沒有電子郵件。如果存在電子郵件,我只需要索引該字段。所以我找到了partialFilterExpression的能力。不幸的是,這是行不通的!它不會拋出任何錯誤,但它很高興允許重複!

People.ensureIndex({ 'emails.email': 1, _companyId: 1 }, { 
    unique: 1, 
    partialFilterExpression: { 
     "emails": { "email": { $and: [{ $exists: true, $ne: "" }] } } 
    }, 
    collation: { locale: "en", strength: 2 } 
}); 

所以我改成了這樣:

People._ensureIndex({ 'emails.email': 1, _companyId: 1 }, { 
    unique: 1, 
    partialFilterExpression: { 
     "emails.email": { $and: [{ $exists: true, $ne: "" }] } 
    }, 
    collation: { locale: "en", strength: 2 } 
}); 

,它不會在所有的話說創建索引:

Error: key emails.email must not contain '.'

有沒有辦法做我我正在努力去做,還是失敗的原因?

回答

0

好了,想通了:

People.ensureIndex({ 'emails.email': 1, _companyId: 1 }, { 
    unique: 1, 
    partialFilterExpression: { 
     "emails.email": { $exists: true } 
    }, 
    collation: { locale: "en", strength: 2 } 
}); 

它說我不能使用$ne,所以我必須確保我的代碼,以消除任何空值。