2012-10-12 55 views
0

我完全不熟悉MongoDB,並且對如何構造數據感到困惑。我需要做的是存儲一組可以通過不同的鍵檢索的對象。例如,我有「CustomerInfo」對象,可以通過「Customer1」,「Customer_1」,「Cust.1」,「Customer 1」等鍵進行引用。MongoDB設計 - 具有多個鍵的相同文檔

在RDMBS中,我將創建一個單獨的表來存儲別名,併爲Customer Info數據創建一行。然後,我會加入他們,使用我從客戶那裏得到的任何別名,並獲得數據。這看起來簡單直接,但到目前爲止,我無法通過創建一個空的數據庫。看起來,我在RDBMS方面的經驗比這種情況下的資產更容易受到阻礙,因爲我傾向於「思考關係型」,而且它顯然不適用於NoSQL數據庫。

任何建議,歡迎提前感謝所有的答案。

回答

4

如果你不能從一個別名到您的應用程序內的實際ID(總是優先)一個選擇是簡單地存儲在您的MongoDB的文檔上的「別名」數組和索引:

文件儲存像這樣:

db.customers { 
    aliases : ["Customer1", "Customer_1", "Cust.1", "Customer 1"], 
    ...other customer info data... 
} 

添加索引:

db.customers.ensureIndex({aliases:1}) 

,然後簡單地對其中任何查詢,所有的這些都將返回文檔上面:

db.customers.find({aliases: "Customer1"}) 
db.customers.find({aliases: "Customer_1"}) 
db.customers.find({aliases: "Cust.1"}) 
db.customers.find({aliases: "Customer 1"}) 

索引是可選的,但會顯着提高性能。

+0

這個答案是正確的。在大多數情況下,如果你有一對多的關係,就像在這種情況下一個customerInfo有許多別名一樣,這是將多個對象作爲一個數組嵌入到一個對象中的最佳解決方案。我只能想到兩種情況,您應該使用引用而不是嵌入:(a)您可以接近每個文檔限制16MB或(b)您修改或查詢父對象上下文之外的子對象。 – Philipp

+0

感謝您的回答,這似乎是一個很好的解決方案。爲了回答您的問題,我*可以*將別名翻譯爲ID,事實上,這就是我使用RBMS所做的。一個CustomerData行ID - >許多別名。 – Diego

+0

@Philipp:客戶對象*將被獨立於別名而在外部進行修改,因爲它始終發生在一對多關係中。別名將保持不變(其中許多是傳統值,不會更改),客戶信息將會更改。在這種情況下,你建議我應該使用參考嗎? – Diego

相關問題