2013-03-28 97 views
0

我想通過Mongoose/MongoDB管理我自己的_id - 因爲默認的很長並且佔用帶寬。如何在Mongoose中自動生成自定義ID?

難點是我需要創建它們(比如說,通過遞增計數器),但我需要在併發環境(Node.JS)中執行此操作。有沒有一個我可以遵循的簡單示例,創建一個模式,使用自定義_id和靜態方法(或更好的方法),每當創建一個新文檔時它會自動生成下一個唯一的_id

+4

ID的長度是否嚴重成爲應用程序的瓶頸?我非常懷疑這一點。最好的辦法是使用一個uuid系統,MongoDB爲你做。 – Chad

回答

2

您可以使用Mongo的findAndModify()來生成順序值。下面是這樣一個例子:

// (assuming db is a reference to a MongoDB database) 
var counters = db.collection('counters'); 
var query = {'name': 'counterName'}; 
var order = [['_id','asc']]; 
var inc = {$inc:{'next':1}}; 
var options = {new: true, upsert: true}; 
counters.findAndModify(query, order, inc, options, function(err, doc) { 

    if(err) { 
    callback(err); 
    return; 
    }  

    var id = doc.next; 
    callback(null, id); 
}); 

儘管生成順序ID外觀上的應用程序非常記住,也有一些缺點時(例如,你需要在地理上分割你的數據庫),這就是爲什麼蒙戈使用長僞隨機密鑰。

2

正如Chad簡要介紹的那樣,Mongo爲您實施了一個uuid系統,考慮了時間戳,網絡地址和計算機名稱以及自動增量2位計數器(如果發生多個具有相同時間戳的條目) 。該模式用於允許分佈式數據庫(即,在不同計算機上運行不同的數據庫實例),同時確保每個條目仍然具有唯一標識符(因爲機器名稱部分將不同)。

試圖發揮自己的架構可能會極大地限制mongo提供的可伸縮性。

+0

乍得,你有一個點,特別是對於地理上分散的系統。這就是說,我的應用程序需要爲客戶瀏覽器提供大量(小)文檔,並在其中每個文檔中攜帶一些'_id'。只用一對夫婦替換24個字符將極大地減少流量。對此有何想法? –

+1

我的想法是,對於現代科技來說,節省(極小)帶寬並不值得無法擴展。如果你100%確定你永遠不需要擴展,並且你的流量總是足夠低,可以由一臺機器來處理,你可以自己做。機會雖然不值得。你可以計算你可以節省的帶寬成本,但是我懷疑它甚至值得你花時間,更不用說我提到的其他折衷了。 –