yuc*_*eel 17 indexing unique mongodb mongodb-query
在我的场景中,集合中有作者,每个作者都有,作者的messages每个消息都可以events.每个演员只允许执行一次动作.
db.people.ensureIndex({messages.messageEvents.eventName: 1, messages.messageEvents.actorId: 1}, {unique: true});
Run Code Online (Sandbox Code Playgroud)
我添加了索引,但没有效果.正如你看到下面,我的文档有哪些具备三个要素"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"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
A. *_*vis 21
Mustafa,虽然它们是在集合中的文档之间强制实施的,但它们并不在单个数组中强制执行.这是一个已知错误,暂时无法修复:
https://jira.mongodb.org/browse/SERVER-1068
但是有一个解决方法.保持您的独特索引,并:
1)确保您的应用程序不会在数组中插入具有重复值的新文档.您可以在插入之前检查应用程序代码中的唯一性.
2)更新现有文档时,使用$ addToSet而不是$ push.
| 归档时间: |
|
| 查看次数: |
9685 次 |
| 最近记录: |