2016-09-20 65 views
1

我正在用MEAN堆棧構建這個項目。在節點中操作Mongo文檔

在我的收藏蒙戈,我的文檔具有以下結構: {_id, 藝術家,專輯 }

每個文件必須是唯一的,我讓MongoDB中找出標識增量爲我添加的文件。

我經由URL來訪問每個文檔具有這種結構: http://server/#/vinyls/_id 所以例如: http://localhost:8181/#/vinyls/57dfe3aab482c58c46715fd2

確定。我已經讀過,在urls中使用mongo ID不一定是壞事。 什麼是讓我擔心的是,我經常在我的節點應用來獲取文檔中使用new ObjectId ...

沒有在路由這樣的例子刪除乙烯:

app.delete('/vinyls/:id', function(req, res) { 

    let vinyls = mongoUtil.vinyls(); // my Mongo collection 
    vinyls.remove({"_id": new ObjectId(req.param('id') ; // can't pass in the Id directly ! 
}); 

會正確的方法是爲我的文檔Ids編寫一個簡單的整數計數器,而不是使用mongo Object_id?

非常感謝您的建議。

回答

0

The ObjectId在設計時的MongoDB考慮分佈式性質的工作,讓你有一個保證,即使有多個應用程序插入到數據庫中(其中該數據庫也可以駐留在多個服務器中),您不會得到重複的_id

你當然可以設計你自己的方法來爲你的數據庫創建一個主鍵。如果你確信你永遠不會使用多個應用程序插入數據庫,並且如果你可以確定不會有重複的_id,那麼這對你來說可能是一個合理的解決方案。

但是,請注意,MongoDB不像大多數關係數據庫那樣提供自動增量主鍵功能。主要原因是因爲MongoDB的設計考慮了Replication,Sharding和橫向擴展性。如果您的數據庫始終包含在單個服務器(如SQL)中,則自動增量字段將起作用。如果您的數據庫分佈在多個服務器上,那麼您將需要增量字段的單一來源,這可能會嚴重限制您的插入性能。

編輯

記住的ObjectId僅僅是一個內置的解決方案,如果將數據插入到MongoDB中沒有提供_id場。你可以用任何你想要的東西代替它,只要你能確定它是唯一的。

例如,在你的情況,這可能是可行的使用(藝術家+專輯)字符串的MD5哈希值,e.g:

db.collection.insert({_id: md5(artist + album), artist: artist, album: album})

它可以提供一個合理的獨特_id。在這種情況下,_id字段將包含普通的32個字符的字符串。

+0

感謝您的回答。 – Lev

+0

感謝您的回答。問題是我必須不斷將我前端應用程序中的數字ID轉換爲mongo Object_id。在那裏,我不得不一直使用新的ObjectId(interger_id)。有沒有辦法解決這個問題? – Lev

+0

您可以使用'_id'字段的散列。我更新了答案,因爲輸入評論太長了。 –

0

當然你可以用這種方式更新。只要確保你的req.param('id')是你相同的24個字符的字符串ObjectId

+0

你的意思是我應該只使用Mongo原生ID?它迫使我在每次我不想獲取一個文檔的時候實例化ObjectId,這感覺很笨拙...... – Lev

+0

'ObjectId'是mongo對_id的默認推薦。你可以總是覆蓋它,我生成你自己的唯一ID並在你的插入語句中傳遞給_id。 Meteor使用一個字符串代替ObjectId。 您可以編寫一個封裝器,爲插入調用傳遞_id的唯一字符串。 – Vardhan