mongodb - MongoDB - 整个集合的唯一索引
问题描述
是否可以在整个Set上创建一个唯一索引,比如说 UserId?
示例代码
@Indexed
val participantIds: Set<UserId>
这样一来,整个Set 是独一无二的。这种组合只存在一次。
例子
[1, 2] // OK
[2, 3] // OK
[2, 1] // NOT OK (combination exists already)
更新
该用例用于消息传递系统。参与者 ID是该单个或组信使的成员。
阅读答案后,我觉得在例如服务层中检查它可能是我的用例,使用$all / $size查询检查来验证这种组合不存在。
解决方案
Mongodb 没有提供开箱即用的解决方案。
您必须自己实施一种解决方法,我个人会做的是唯一索引一个包含设置数字的新字段:
const newDoc = { participantIds: [1, 2, 3]};
const uniqueStr = newDoc.participantIds.sort().join('');
await db.collection.insertOne({ ...newDoc, uniqueField: uniqueStr });
现在通过建立一个唯一的索引,uniqueField
你可以维护它。请注意,每次文档更新都需要更新此字段,这会增加很多开销。
也许如果你能提供更多关于你想要做什么和实现的细节,那么帮助你想出一个更可行的解决方案会更容易。
推荐阅读
- python - 关闭“Python 3.5 版不支持变量注释”错误消息
- architecture - 确定软件解决方案是依赖 32 位还是 64 位?
- docker - 在 Java 中处理 Presto ResultSet:“SQLException:不在有效行上”
- vue.js - Vue + Vuetify 数据表第一列图片
- c# - 我正在尝试将 selenium webdriver 截取的屏幕截图上传到 blob 存储,因为整个测试都是在 vsts 云服务上完成的
- php - PHP 7.2 说 Yaz 函数未定义
- c# - LINQ 加入/更新数据库中的对象列表
- java - java.lang.IllegalArgumentException: Unexpected char 0x1d at 4 in signature value:
- node.js - 如何获得多个bodyResponses到ejs
- three.js - 加载多个 fbx