对象数组上的唯一partialFilterExpression索引不起作用

时间:2017-01-23 04:09:57

标签: mongodb

我有一个像这样的对象结构的集合:

{
    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 '.'

有没有办法做我想做的事,或者这是一个失败的原因?

1 个答案:

答案 0 :(得分:0)

好的,想通了:

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

它说我无法使用$ne,所以我必须在我的代码中确保删除任何空白值。