我正在用MEAN堆栈构建这个项目。
在我的Mongo系列中,我的文档有以下结构: {_ID, 艺术家, 专辑}
每个文档都必须是唯一的,我让mongodb在添加文档时找出Id增量。
我通过具有以下结构的网址访问每个文档: http://server/#/vinyls/_id 例如: http://localhost:8181/#/vinyls/57dfe3aab482c58c46715fd2
确定。我已经读过在网址中使用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 !
});
这样做的正确方法是为我的文档ID编写一个简单的整数计数器而不是使用mongo Object_id吗?
非常感谢你的建议。答案 0 :(得分:0)
当然可以这样更新。只需确保您的req.param('id')
与您ObjectId
答案 1 :(得分:0)
The ObjectId旨在满足MongoDB的分布式特性,因此您可以保证即使有多个应用程序插入数据库(数据库也可以驻留在多个服务器中),没有获得重复_id
。
您当然可以设计自己的方法来为数据库创建主键。如果您确定永远不会使用多个应用程序插入数据库,并且如果您确定不会复制_id
,那么它可能是一个合理的解决方案。
但请注意,MongoDB不像大多数关系数据库那样提供自动增量主键功能。主要原因是MongoDB的设计考虑了Replication,Sharding和水平可伸缩性。如果数据库始终包含在单个服务器(如SQL)中,则自动增量字段将起作用。如果您的数据库分布在多个服务器上,那么增量字段需要一个单一的事实来源,这可能严重限制您的插入性能。
修改强>
请记住,如果在不提供_id
字段的情况下将数据插入MongoDB,ObjectId只是一个内置解决方案。你可以用你想要的任何东西替换它,只要你能确定它是独一无二的。
例如,在您的情况下,使用(艺术家+专辑)字符串的md5哈希可能是可行的,例如:
db.collection.insert({_id: md5(artist + album), artist: artist, album: album})
可以提供相当独特的_id
。在这种情况下,_id
字段将包含一个普通的32个字符的字符串。