下面的代码表示101已经开始与102聊天。
db.chat.insert(
{
"mydate" : ISODate(),
"chatusers" : [101,102]
}
)
要确保此条目是唯一的,并且不应该有任何重复 [101,102]或[102,101]试图在聊天用户中添加唯一索引,但这不适用于对,因为它不允许使用101或102中的任何一个。
问题: 一种方法是确保在应用程序结束或我应该更改我的集合架构? 什么是更好的方法,请为此建议架构。
注意: select查询将基于发送方和接收方。
答案 0 :(得分:1)
数组大小仅包含2个发送方和接收方元素。并且组合应该是独特的。基于谷歌,我不确定阵列是否是正确的选择?
是的,数组不是正确的选择,因为1)mongodb给予他们特殊的处理,2)在语义上,两个元素顺序不同的数组是不同的数组。
因此,假设您的阵列运行良好,足以满足您的查询等等,这里有关于如何确保组合的唯一性的方法:
创建一个可正确索引类型的合成派生字段。例如,字符串。因此,对于"chatusers" : [102,101]
,您可以将聊天用户排序并连接起来,生成如下内容:
"chatusers_sig": "101,102"
现在,您可以在此字段上构建唯一索引。当聊天用户数组发生变化时(如果有),请不要忘记更新它。
答案 1 :(得分:0)
塞尔吉奥建议的解决方案似乎是正确的。
db.chat.insert(
{
"mydate" : ISODate(),
"chatusers" : [101,102],
"chat_sig" : "101_102"
}
)
Neil建议的解决方案存在一个基本缺陷。
db.chat.insert(
{
"mydate" : ISODate(),
"sender" : 101,
"receiver": 102,
}
)
在发送方和接收方上添加复合唯一索引将保证sender-receiver = 101-102不重复但102-101仍然存在,因此基本要求不符合