簡體   English   中英

在mongoDB中索引大型數組

[英]indexing large array in mongoDB

根據mongoDB文檔,不建議為大型數組創建多鍵索引,那么替代方法是什么?

我想通知我的應用程序用戶,只要他們的聯系人之一也開始使用該應用程序,因此我必須上載和管理每個用戶的聯系人列表。 我們將mongoDB與具有兩個輔助計算機的主副本集一起使用。 mongo是否可以處理具有數百個值的數組的多鍵索引? 數十萬個用戶的數百個聯系人可能很難管理。

多鍵解決方案如下所示:

{
  customerId: "id1",
  contacts: ["aaa", "aab", "aac", .... "zzz"]
}

index: createIndex({ contacts: 1 })

另一個解決方案是將每個聯系人保存在自己的文檔中,並保存所有與他相關的應用程序用戶:

{
  phone: "aaa",
  contacts: ["id1", "id2", "id3"]
},
{
  phone: "aab",
  contacts: ["id1"]
},
{
  phone: "aac",
  contacts: ["id1"]
},
......
{
  phone: "zzz",
  contacts: ["id1"]
}
index: createIndex( { phone: 1 } )

上載聯系人列表時,兩者的書寫性能均較差:
第一個用於計算巨大的索引,第二個用於同時更新大量文檔。
有更好的方法嗎?
我正在使用具有兩個輔助計算機的副本集,分片鍵可以幫助嗎?

謝謝

為了索引保存數組值的字段,MongoDB為數組中的每個元素創建一個索引鍵。 這些多鍵索引支持對數組字段的有效查詢 因此,如果我是您,我的數據模型將如下所示:

{
    customerId: "id1",
    contacts: ["_idx", "_idy", "_idw", .... "_idz"]
}

然后在聯系人上創建索引。 MongoDB默認在id上創建索引。 因此,您將不得不為非應用程序用戶創建新文檔,只需嘗試添加一個字段,例如“ app_user”:true / false。

為了提高索引性能,您可以使其在后台構建而沒有任何問題,對於副本集, 這是這樣做的。

對於分片 ,這將無濟於事,因為您甚至無法分片任何東西,因為您的集群中只有一個主節點。 分片至少需要2套主要的Mongo實例,因此,在您的情況下,您可以添加第四個服務器,然后有兩個副本集,一個主副本和一個輔助副本,然后對其進行分片,然后將系統轉換為2個復制的分片。

一旦實現這一目標,顯然,即使在MongoDB中要處理的文檔並不多,也可以平衡兩個分片之間的負載。

另一方面,如果要進行分片,則需要使用Mongodb 3.4或更高版本的配置服務器進行更多設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM