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")})