2017-10-19 79 views
0

我有更多的MySQL背景比MongoDB,所以我只是試圖找出基於從API檢索數據路由的最佳做法。例如,我想要訪問的網址:MongoDB和URL路由

site.com/movies/12 

,然後加載檢索所有的從MongoDB的關於電影的信息與12的ID,但蒙戈的id是_id一個參考,這是一個自動生成的字符串(當然不是我想要的url)。那麼這是否意味着我應該爲電影集合中的每個條目創建自己的索引?如果是這樣,我不得不稱之爲除id以外的東西,對吧?

我見過很多不包含自定義密鑰的例子,但我不太瞭解它。當然,他們不想在他們的應用中鏈接到site.com/movies/59e8fdcffeeecb22334fd355

回答

0

在創建文檔時,如果我們提供_id作爲插入語句的一部分,那麼用戶提供的值將由mongodb獲取,因此,我們需要確保_id應該是唯一值。即使您爲_id重複賦值,也不用擔心,那麼我們會收到錯誤消息。

我有一個名爲計算器樣品收集和具有兩個屬性

db.stackoverflow.insert({ _id:1, movie:"Mission Impossible 1"}) 
WriteResult({ "nInserted" : 1 }) 

其文件當我試圖插入具有相同_id則獲得的錯誤信息(錯誤信息相同的文檔,如圖蒙戈殼牌)

WriteResult({ 
     "nInserted" : 0, 
     "writeError" : { 
       "code" : 11000, 
       "errmsg" : "E11000 duplicate key error collection: test.stackove 
rflow index: _id_ dup key: { : 1.0 }" 
     } 
}) 

對於你的情況,如果你擁有電影收藏。我們可以用符合我們要求的方便_id來改寫收藏。

請注意,更新文檔的_id是不可能的,因爲 _id相當於RDBMS錶行的主鍵。

因此,對於改變文檔_id值,可以做如下圖所示(創建一個新的文件,並刪除舊文件)

// Find the document and store it in a variable 
doc = db.movies.findOne({_id: ObjectId("5dd45467d55f4d2d2a115502")}) 

// Give a convenient new _id 
doc._id = 1 

// Insert the document using the new _id 
db.movies.insert(doc) 

// Now we will be having two documents for the same movie, so remove the old one 
db.movies.remove({_id: ObjectId("5dd45467d55f4d2d2a115502")})