2016-09-20 39 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