mongo ObjectID、ObjectId 和 Mongoose ObjectId 三者之间有何不同?

12
我无法弄清楚mongo ObjectID和ObjectId之间的区别。文档中说ObjectId,但是当我看代码时,我看到了


import { ObjectID } from 'bson';

让事情更加混乱的是mongoose文档和代码。mongoose也称之为ObjectId http://mongoosejs.com/docs/api.html#types-objectid-js,但当我阅读代码时,我看到了

// mongodb.ObjectID does not allow mongoose.Types.ObjectId(id). This is
//   commonly used in mongoose and is found in an example in the docs:
//   http://mongoosejs.com/docs/api.html#aggregate_Aggregate
// constructor exposes static methods of mongodb.ObjectID and ObjectId(id)
type ObjectIdConstructor = typeof mongodb.ObjectID & {
  (s?: string | number): mongodb.ObjectID;
}

那么,ObjectID、ObjectId和mongoose ObjectId之间到底有什么区别?

我发现还有另一个Stack Overflow上讨论这个问题的帖子BSON::ObjectId vs Mongo::ObjectID

不过那里的链接已经失效了,而且也没有提到mongoose。所以我希望我的问题不会被标记为重复。


除了 mongoose 导入实际上是一个“封装类型”(就像你引用的代码中所示)之外,没有任何本质区别,这基本上与“类型转换”相关,因为各种 mongoose 方法允许您指定将在内部 “转换” 为 ObjectID 的“字符串”值。重点是 Schema.Types.ObjectId 对于定义的 mongoose 模式具有特殊含义。但是底层数据(实际实现)其实是一样的。 - Neil Lunn
1
但是mongo ObjectID和ObjectId呢,它们是一样的吗? - Qiulang
3
是的,它们是相同的。从代码中可以看到,导入来自于名为"bson"的库。核心驱动程序中也是如此。回到您提到的答案,随着时间的推移,所有语言实现都将"BSON"部分从核心驱动程序中分离出来作为一个单独的依赖项。事实上,JavaScript 的 BSON 库在浏览器中也可以正常工作。因此,没有区别,只是在不同的上下文中"实现"了相同的库方法。 - Neil Lunn
2个回答

0

Mongo ObjectID是MongoDB生成的唯一12字节标识符,可作为主键。

ObjectID是一个唯一的非空整数字段,用于唯一地标识表中的行。

在Mongoose中,ObjectID与Mongo ObjectID相同,并用于引用另一个集合中的对象。


0
  1. ObjectID:这是MongoDB使用的BSON ObjectID数据类型。它是一个12字节的标识符,通常由时间戳、机器标识符、进程ID和计数器组成。这是由Node.js的原生MongoDB驱动程序提供的。

  2. ObjectId:在MongoDB shell中经常看到这个词,实际上它与ObjectID是一样的。只是命名约定不同。当您在MongoDB shell中工作时,您将使用ObjectId。但在使用MongoDB原生驱动程序的Node.js环境中,您将使用ObjectID

  3. Mongoose ObjectId:Mongoose是一个设计用于在异步环境中工作的MongoDB对象建模工具。Mongoose提供了一种简单直观的基于模式的解决方案,用于将应用程序数据与MongoDB建模。在Mongoose中的ObjectId实际上与Node.js的MongoDB原生驱动程序中的ObjectID是一样的。Mongoose只是提供了额外的便利和功能。

总之,这三个术语本质上是指同一件事,只是在稍微不同的上下文中使用(MongoDB shell vs. Node.js环境 vs. Mongoose环境)。


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