在 Node 中操作 Mongo 文档
Posted
技术标签:
【中文标题】在 Node 中操作 Mongo 文档【英文标题】:Manipulating Mongo Documents in Node 【发布时间】:2016-09-20 00:28:47 【问题描述】:我正在使用 MEAN 堆栈构建这个项目。
在我的 Mongo 集合中,我的文档具有以下结构: _ID, 艺术家, 专辑
每个文档都必须是唯一的,我让 mongodb 在添加文档时找出 Id 增量。
我通过具有以下结构的 url 访问每个文档: http://server/#/vinyls/_id 例如: http://localhost:8181/#/vinyls/57dfe3aab482c58c46715fd2
好的。我读过在 url 中使用 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 吗?
非常感谢您的建议。
【问题讨论】:
【参考方案1】:The ObjectId 在设计时考虑到了 MongoDB 的分布式特性,因此您可以保证即使有多个应用程序插入到数据库中(其中数据库也可以驻留在多个服务器中),您不会不会得到重复的_id
。
您当然可以设计自己的方法来为您的数据库创建主键。如果您确定您永远不会使用多个应用程序插入数据库,并且您可以确定不会有重复的_id
,那么它可能是您的合理解决方案。
但是,请注意,MongoDB 并没有像大多数关系数据库那样提供自增主键功能。主要原因是 MongoDB 在设计时考虑了Replication、Sharding 和水平可扩展性。如果您的数据库始终包含在单个服务器(如 SQL)中,则自动增量字段将起作用。如果您的数据库分布在多台服务器上,那么您需要为递增字段提供单一数据源,这可能会严重限制您的插入性能。
编辑
请记住,如果您将数据插入 MongoDB 而不提供 _id
字段,则 ObjectId 只是一个内置解决方案。只要您确定它是独一无二的,您就可以将其替换为您想要的任何东西。
例如,在您的情况下,使用(艺术家 + 专辑)字符串的 md5 哈希可能是可行的,例如:
db.collection.insert(_id: md5(artist + album), artist: artist, album: album)
这可以提供一个相当独特的_id
。在这种情况下,_id
字段将包含一个普通的 32 个字符的字符串。
【讨论】:
感谢您的回答。 感谢您的回答。问题是我必须不断将前端应用程序中的数字 ID 转换为 mongo Object_id。因为我必须一直 new ObjectId(interger_id) 。有办法解决吗? 您可以为_id
字段使用哈希。我更新了答案,因为输入评论太长了。
不用担心。如果对您有帮助,请采纳答案。【参考方案2】:
当然可以这样更新。只需确保您的 req.param('id')
与您的 ObjectId
相同的 24 个字符串即可
【讨论】:
你的意思是我应该只使用 Mongo 本地 ID 吗?它迫使我每次不想获取文档时都实例化 ObjectId,感觉很笨拙......ObjectId
是 mongo 对 _id 的默认推荐。您始终可以在生成您自己的唯一 ID 时覆盖它,并在您的插入语句中将其传递给 _id。 Meteor 使用字符串代替 ObjectId。您可以编写一个包装器,为您的插入调用传递 _id 的唯一字符串。以上是关于在 Node 中操作 Mongo 文档的主要内容,如果未能解决你的问题,请参考以下文章
如何使用不同的 mongo 数据库设置不同的 node.js 环境?