In my scenerio, there are authors in a collection, each author has messages and each message of author can has events . Each actor allowed to perform only one kind of action once.

db.people.ensureIndex({messages.messageEvents.eventName: 1, messages.messageEvents.actorId: 1}, {unique: true});

I added index but it has no effect. As you see below, my document has three elements which have "eventName":"vote" and "actorId":"1234" that should be against my constraint.

How to ensure unique item in messageEvents array based on eventName and actorId fields ?

Actually, i need to update the existing item without a second search and update event instead of rejecting it .