在 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 文档的主要内容,如果未能解决你的问题,请参考以下文章

mongoDB应用篇-mongo聚合查询

mongo系列mongo基本概念及操作

如何使用不同的 mongo 数据库设置不同的 node.js 环境?

如何在 javascript (meteor.js) 中操作返回的 mongo 集合/游标?

Mongo 连接流在 NodeJS 应用程序中意外关闭

node.js操作mongoDB数据库