我有一个像这样的对象结构的集合:
{
emails: [{email:"bob@jones.com", 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 :(得分:0)
好的,想通了:
People.ensureIndex({ 'emails.email': 1, _companyId: 1 }, {
unique: 1,
partialFilterExpression: {
"emails.email": { $exists: true }
},
collation: { locale: "en", strength: 2 }
});
它说我无法使用$ne
,所以我必须在我的代码中确保删除任何空白值。