【问题标题】:How to convert a string to ObjectId in nodejs mongodb native driver?如何在nodejs mongodb本机驱动程序中将字符串转换为ObjectId?
【发布时间】:2014-01-31 07:45:54
【问题描述】:

我在nodejs 环境中使用mongodb native driver,我需要将id 字符串转换为ObjectId 以在我的更新查询中使用它,我该怎么做?

【问题讨论】:

    标签: javascript node.js mongodb


    【解决方案1】:

    ObjectId (nodejs driver doc)

    当您有一个表示 BSON ObjectId 的字符串(例如从 Web 请求中接收)时,您需要将其转换为 ObjectId 实例:

    const {ObjectId} = require('mongodb'); // or ObjectID 
    // or var ObjectId = require('mongodb').ObjectId if node version < 6
    
    const updateStuff = (id, doc) => {
      // `ObjectId` can throw https://github.com/mongodb/js-bson/blob/0.5/lib/bson/objectid.js#L22-L51, it's better anyway to sanitize the string first
      if (!ObjectId.isValid(s)) {
        return Promise.reject(new TypeError(`Invalid id: ${id}`));
      }
      return collection.findOneAndUpdate(
        {_id: ObjectId(id)}, 
        {$set: doc}, 
        {returnOriginal: false}
      );
    };
    

    【讨论】:

    • 谢谢,您对我的用例是正确的。但是如果我在客户端生成_id,是否需要检查它在我的收藏中的唯一性?我认为检查比服务器端的类型转换更昂贵,你怎么看?
    • “如果值不是唯一的,插入将失败”来自 docs.mongodb.org/manual/reference/method/db.collection.insert,我不知道每个的性能方法,但 ObjectIds 只是 24bytes 哈希,这取决于你的实现
    • 您好,@caub 感谢您的宝贵回答。我是 Angular 2/4 和 MongoDb 的新手。在我的应用程序中,我使用 Angular 2、LoopBack 和 MongoDb。我不确定应该在哪里添加这段代码!应将其添加到 Angular 打字稿文件还是 LoopBack 服务器文件中?你能指导我吗?我完全被困在这个时间点。如果我在打字稿文件中添加此代码,则出现以下错误:找不到模块:错误:无法解析“mongodb”
    • 这个逻辑在服务器上,它使用mongodb驱动包(仅限nodejs)
    • @PrasadKaiche ObjectId 可能是 used on client or server 但如果这样做,请注意如何生成这些 ID,以确保它们尽可能独特
    【解决方案2】:
    var {ObjectId} = require('mongodb'); // or ObjectID Not Working
    

    @caubub 提到的对我不起作用。

    但是当我在 mongodb 中使用 var ObjectID = require('mongodb').ObjectID; // convert string to ObjectID 时,我可以在 nodejs mongodb 本机驱动器中将字符串转换为 ObjectId。

    参考访问http://mongodb.github.io/node-mongodb-native/2.2/api/ObjectID.html

    【讨论】:

    • 澄清一下,ES6 对象解构 ({ ObjectID } = require...) 仅适用于 Node 6.0 及以上版本,旧版本需要旧语法。
    • ObjectID(大写“D”)已弃用。请改用 ObjectId(小写“d”)。 (来源:@types/bson包)
    【解决方案3】:

    您可以在类似的聚合管道中使用$toObjectId

    db.CollectionWithStringId.aggregate([
    {$addFields: {
        _id: { $toObjectId: "$_id" }
    }}
    

    ])

    来源:https://docs.mongodb.com/manual/reference/operator/aggregation/toObjectId/

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 2011-12-11
      • 2018-11-09
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 2012-02-05
      • 2020-05-28
      • 1970-01-01
      相关资源
      最近更新 更多