在节点

时间:2016-09-20 00:28:48

标签: node.js mongodb express

我正在用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吗?

非常感谢你的建议。

2 个答案:

答案 0 :(得分:0)

当然可以这样更新。只需确保您的req.param('id')与您ObjectId

的24个字符串相同

答案 1 :(得分:0)

The ObjectId旨在满足MongoDB的分布式特性,因此您可以保证即使有多个应用程序插入数据库(数据库也可以驻留在多个服务器中),没有获得重复_id

您当然可以设计自己的方法来为数据库创建主键。如果您确定永远不会使用多个应用程序插入数据库,并且如果您确定不会复制_id,那么它可能是一个合理的解决方案。

但请注意,MongoDB不像大多数关系数据库那样提供自动增量主键功能。主要原因是MongoDB的设计考虑了ReplicationSharding和水平可伸缩性。如果数据库始终包含在单个服务器(如SQL)中,则自动增量字段将起作用。如果您的数据库分布在多个服务器上,那么增量字段需要一个单一的事实来源,这可能严重限制您的插入性能。

修改

请记住,如果在不提供_id字段的情况下将数据插入MongoDB,ObjectId只是一个内置解决方案。你可以用你想要的任何东西替换它,只要你能确定它是独一无二的。

例如,在您的情况下,使用(艺术家+专辑)字符串的md5哈希可能是可行的,例如:

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

可以提供相当独特的_id。在这种情况下,_id字段将包含一个普通的32个字符的字符串。