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

65
4个回答

96

使用ObjectIdnodejs驱动程序文档),当您有一个表示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,那么在我的集合中检查其唯一性是必需的吗?我认为这个检查比在服务器端进行类型转换更昂贵,你怎么看? - Nasser Torabzade
1
如果值不唯一,插入操作将失败。 我不清楚每种方法的性能情况,但是ObjectIds只是24字节的哈希值,它取决于你的实现。 - caub
你好,@caub,感谢您宝贵的回答。我在Angular 2/4和MongoDb方面有点新手。在我的应用程序中,我正在使用Angular 2、LoopBack和MongoDb。我不确定这段代码应该添加到哪里!它应该添加到Angular typescript文件还是LoopBack服务器文件中?您能指导我吗?我完全卡在这个时间点上了。如果我将此代码添加到typescript文件中,则会出现以下错误:找不到模块:错误:无法解析'mongodb'。 - Prasad Kaiche
这个逻辑在服务器上,它使用 mongodb 驱动程序包(仅限于nodejs)。 - caub
@PrasadKaiche ObjectId 单独可以在客户端或服务器上使用,但是如果您这样做,请注意如何生成这些 ID,以确保它们尽可能唯一。 - caub

11
var {ObjectId} = require('mongodb'); // or ObjectID Not Working

正如@caubub所说,对我没有用。

但是当我在mongodb中使用var ObjectID = require('mongodb').ObjectID; // 将字符串转换为ObjectID,然后在nodejs mongodb原生驱动程序中能够将字符串转换为ObjectId。

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


3
澄清一下,ES6对象解构({ ObjectID } = require...)仅适用于Node 6.0及以上版本,旧版本需要使用旧语法。 - MacK
3
"ObjectID"(大写的 "D")已经被废弃,请使用小写的 "d" 的 "ObjectId" 代替。(来源: @types/bson 包) - Hendy Irawan

1

0

我的mongodb版本:4.9.1(nodejs)

你只需要:

import { Collection, ObjectId } from "mongodb";

然后,例如要删除文档,只需执行以下操作:

return await collection.deleteOne({ _id: new ObjectId(id)});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接