在我的场景中,集合中有作者,每位作者都有messages
,作者的每条消息都有events
。每个演员只允许执行一次动作。
db.people.ensureIndex({messages.messageEvents.eventName: 1, messages.messageEvents.actorId: 1}, {unique: true});
我添加了索引,但没有效果。如下所示,我的文档有三个元素,"eventName":"vote"
和"actorId":"1234"
应该违反我的约束。
如何根据messageEvents
和eventName
字段确保actorId
数组中的唯一项?
实际上,我需要在没有第二次搜索和更新事件的情况下更新现有项目,而不是拒绝它。
{
"_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"
}
]
}
]
}
答案 0 :(得分:21)
Mustafa,虽然它们是在集合中的文档中强制执行的,但是在单个数组中不会强制实施唯一约束。这是一个已知错误,暂时无法修复:
https://jira.mongodb.org/browse/SERVER-1068
但是有一种解决方法。保持您的独特索引,并且:
1)确保您的应用程序不会在数组中插入具有重复值的新文档。您可以在插入之前检查应用程序代码中的唯一性。
2)更新现有文档时,请使用$ addToSet而不是$ push。