2017-01-23 3 views
0

私はそうのようなオブジェクト構造を持つコレクションを持っている:ユニークpartialFilterExpression指数は

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

は、私がemails_companyIdの組み合わせがユニークになるように、一意のインデックスを作成します。私は単純な複合インデックスを作成するだけですが、電子メールなしで2人を保存すると、emails.emailフィールドの値がインデックスされず、インデックスに_companyIdのままで、重複キーがスローされるため、2番目のフィールドにエラーがスローされます電子メールなしで2番目の文字を挿入しようとするとエラーが発生します。電子メールがある場合にのみフィールドのインデックスを作成します。だから私は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 '.'

は何を行う方法がありますIやろうとしているのですか、それとも失われた原因ですか?

[OK]を

答えて

0

は、それを考え出した:

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

をそれは私が$neを使用することができなかったことを言ったので、私はただのブランク値を削除するために私のコードで確認しなければなりませんでした。