【问题标题】:Manipulating Mongo Documents in Node在 Node 中操作 Mongo 文档
【发布时间】: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 吗?

非常感谢您的建议。

【问题讨论】:

    标签: node.js mongodb express


    【解决方案1】:

    The ObjectId 在设计时考虑到了 MongoDB 的分布式特性,因此您可以保证即使有多个应用程序插入到数据库中(其中数据库也可以驻留在多个服务器中),您不会不会得到重复的_id

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

    但是,请注意,MongoDB 并没有像大多数关系数据库那样提供自增主键功能。主要原因是 MongoDB 在设计时考虑了ReplicationSharding 和水平可扩展性。如果您的数据库始终包含在单个服务器(如 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 的唯一字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多