2017-03-19 10 views
0

私は私のデータベースはすべての人の著書のためだけ1オープン要求を持っている必要があり、次のスキーマ特定の値を持つマングースユニークインデックスを作成するにはどうすればよいですか?

const TradeRequestSchema = mongoose.Schema({ 
    status: { 
    type: String, 
    enum: ["opened", "rejected", "accepted"], 
    default: "opened" 
    }, 

    _requester: { 
    required: true, 
    type: mongoose.Schema.Types.ObjectId 
    }, 

    _requestedBook: { 
    required: true, 
    type: mongoose.Schema.Types.ObjectId 
    } 
}); 

TradeRequestという名前のコレクションを持っています。
だから私はそうのような一意のインデックスを追加 -

TradeRequestSchema.index({_requester: 1, _requestedBook: 1, status: 1}, {unique: true}); 

問題は、これは許されるべきであるデータベースに入力するためのいくつかのデータを防ぐことです。

例えば、それは私のユースケースの罰金である下記の書類持っている私のデータベースを防ぐ -

{_id: 1, _requester: 12345, _requestedBook: 9871212, status: "opened"} 
{_id: 2, _requester: 12345, _requestedBook: 9871212, status: "opened"} 

をしかし、それはまた、私のユースケースのために間違っている次のことを防ぎます。例えば

私のデータベースがすでに以下のドキュメントを持っている場合 -

{_id: 3, _requester: 12345, _requestedBook: 9871212, status: "closed"} 
{_id: 4, _requester: 12345, _requestedBook: 9871212, status: "opened"} 

私は今間違っているclosedへのid 4で要求を変更することはできませんが。

基本的には、bookの1つのopenedリクエストがありますが、複数のclosedリクエストがあります。

どうすればよいですか?

答えて

2

Mongodbには、一意索引、疎索引および部分索引のような多くのタイプの索引があります。あなたのケースにはユニークなインデックスだけが必要ではなく、unique partial indexが必要です。以下のようなものを作成してみてください -

db.<<collectionName>>.createIndex(
{_requester: 1, _requestedBook: 1, status: 1}, 
{unique: true, partialFilterExpression: { "status" : "opened" }} 
) 

...それは助け

+0

感謝を願っています。それが私が探していたものです。 –

関連する問題