我想通過Mongoose/MongoDB管理我自己的_id
- 因爲默認的很長並且佔用帶寬。如何在Mongoose中自動生成自定義ID?
難點是我需要創建它們(比如說,通過遞增計數器),但我需要在併發環境(Node.JS)中執行此操作。有沒有一個我可以遵循的簡單示例,創建一個模式,使用自定義_id
和靜態方法(或更好的方法),每當創建一個新文檔時它會自動生成下一個唯一的_id
?
我想通過Mongoose/MongoDB管理我自己的_id
- 因爲默認的很長並且佔用帶寬。如何在Mongoose中自動生成自定義ID?
難點是我需要創建它們(比如說,通過遞增計數器),但我需要在併發環境(Node.JS)中執行此操作。有沒有一個我可以遵循的簡單示例,創建一個模式,使用自定義_id
和靜態方法(或更好的方法),每當創建一個新文檔時它會自動生成下一個唯一的_id
?
您可以使用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外觀上的應用程序非常記住,也有一些缺點時(例如,你需要在地理上分割你的數據庫),這就是爲什麼蒙戈使用長僞隨機密鑰。
正如Chad簡要介紹的那樣,Mongo爲您實施了一個uuid系統,考慮了時間戳,網絡地址和計算機名稱以及自動增量2位計數器(如果發生多個具有相同時間戳的條目) 。該模式用於允許分佈式數據庫(即,在不同計算機上運行不同的數據庫實例),同時確保每個條目仍然具有唯一標識符(因爲機器名稱部分將不同)。
試圖發揮自己的架構可能會極大地限制mongo提供的可伸縮性。
乍得,你有一個點,特別是對於地理上分散的系統。這就是說,我的應用程序需要爲客戶瀏覽器提供大量(小)文檔,並在其中每個文檔中攜帶一些'_id'。只用一對夫婦替換24個字符將極大地減少流量。對此有何想法? –
我的想法是,對於現代科技來說,節省(極小)帶寬並不值得無法擴展。如果你100%確定你永遠不需要擴展,並且你的流量總是足夠低,可以由一臺機器來處理,你可以自己做。機會雖然不值得。你可以計算你可以節省的帶寬成本,但是我懷疑它甚至值得你花時間,更不用說我提到的其他折衷了。 –
ID的長度是否嚴重成爲應用程序的瓶頸?我非常懷疑這一點。最好的辦法是使用一個uuid系統,MongoDB爲你做。 – Chad