2017-06-07 57 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