如何在nodejs mongodb本机驱动程序中将字符串转换为ObjectId?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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/

【讨论】:

以上是关于如何在nodejs mongodb本机驱动程序中将字符串转换为ObjectId?的主要内容,如果未能解决你的问题,请参考以下文章

通过 NodeJS 与 MongoDB 反应本机 [关闭]

NodeJS 本机驱动程序上的示例 MongoDB 错误是啥样的?

如何在 javascript (ionic | Angular | NodeJS | MongoDB) 中将包含对象的数组展平和减少为逗号分隔的字符串

使用适用于 Node JS 的 mongodb 本机驱动程序记录所有查询

为桌面、移动本机应用程序和 oAuth 功能设计 nodejs expressjs mongodb Webserver 流

mongodb本机驱动程序获取没有数据库名称的集合名称