私のシーンリオでは、コレクションに著者がいて、各著者が持っていてmessages
、著者の各メッセージが持つことができますevents
。各アクターは、1種類のアクションのみを1回実行できました。
db.people.ensureIndex({messages.messageEvents.eventName: 1, messages.messageEvents.actorId: 1}, {unique: true});
インデックスを追加しましたが、効果がありません。以下に示すように、私のドキュメントには3つの要素があり"eventName":"vote"
、"actorId":"1234"
それは私の制約に反するはずです。
とフィールドmessageEvents
に基づいて配列内の一意のアイテムを確保するにはどうすればよいですか?eventName
actorId
実際、既存のアイテムを拒否するのではなく、2回目の検索と更新イベントなしで更新する必要があります。
{
"_id": "1234567",
"authorPoint": 0,
"messages": [
{
"messageId": "112",
"messageType": "Q",
"messagePoint": 0,
"messageEvents": [
{
"eventName": "Add",
"actorId": "1234",
"detail": ""
},
{
"eventName": "Vote",
"actorId": "1234",
"detail": "up"
},
{
"eventName": "Vote",
"actorId": "1234",
"detail": "down"
},
{
"eventName": "Vote",
"actorId": "1234",
"detail": "cork"
}
]
}
]
}