2017-06-07 60 views
-1

下面的代码表示101已经开始聊天102保持独特的数组在蒙戈

db.chat.insert(
    { 
    "mydate" : ISODate(), 
    "chatusers" : [101,102] 
    } 
) 

为了确保该条目是独一无二的,应该有像 [101,102]或没有重复[102101]受审在聊天用户中添加唯一索引,但这不适用于成对,因为它不允许使用101或102中的任一个。

问题: 一种方法是确保应用程序结束或应更改我的集合架构? 什么是更好的方法,请建议相同的架构。

注意: select查询将基于发件人和收件人。

+1

嘛['$ addToSet '](https://docs.mongodb.com/manual/reference/operator/update/addToSet/)实际上就是问题标题的搜索结果的顶部。搜索引擎可以做什么让人惊叹。 –

+0

@NeilLunn:'$ addToSet'维护数组中的唯一元素。我明白,问题是如何确保集合中数组的唯一性。 –

+0

@SergioTulentsev我不同意。问题是要求确保'[101,102]'与'[102,101]'相同。在我检查的最后一个被称为“集合”。 –

回答

1

数组大小只包含2个元素的发送者和接收者。并且组合应该是唯一的。基于谷歌我不知道阵列是否是正确的选择?

是的,阵列是不是正确的选择,因为1)的mongodb给他们特殊处理和2)语义,两个阵列具有不同顺序的元素是不同阵列。

因此,假设您的阵列的作品不够好,以满足你的查询和诸如此类的东西,这里是你如何能保证组合的独特性:

做适当的可索引类型的synthethic衍生领域。例如,字符串。因此,对于"chatusers" : [102,101],你把聊天的用户,排序他们并连接,产生这样的事情:

"chatusers_sig": "101,102" 

现在你可以在这个领域建立的唯一索引。当聊天用户数组发生变化时(如果有),请不要忘记更新它。

+0

”102,101“是与上次不同的值我查过了,如果是的话“文档”唯一性,那么这些值需要位于“分离”字段中,并带有复合唯一索引。 –

+0

@尼尔伦:不,它是全集合的独特性。套。 –

+0

试试看看。并尽量不要滑稽。我给你一些合理的建议,这不保持唯一 –

0

塞尔吉奥建议的解决方案似乎是正确的。

db.chat.insert(
    { 
    "mydate" : ISODate(), 
    "chatusers" : [101,102], 
    "chat_sig" : "101_102" 
    } 
) 

尼尔建议的解决方案有一个基本的缺陷。

db.chat.insert(
    { 
    "mydate" : ISODate(), 
    "sender" : 101, 
    "receiver": 102, 
    } 
) 

在发送者和接收者添加复合唯一索引将保证发送器 - 接收= 101-102不重复,但102-101仍然可以存在,因此基本的要求不符合

+0

这个答案如何被upvoted/accepted,但我的不是? :不解: –

+1

@SergioTulentsev同意,你的答案应该是一个可以接受的答案。我可以上传你的答案。 – chicharito