【发布时间】:2018-02-13 05:26:55
【问题描述】:
我无法弄清楚 mongo ObjectID 和 ObjectId 之间的区别。 文档上写着ObjectId,但是看了代码,我看到了
import { ObjectID } from 'bson';
更让人困惑的是猫鼬文档和代码。 猫鼬还说 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到底有什么区别呢?
我发现有另一个 SO 在谈论这个 BSON::ObjectId vs Mongo::ObjectID
虽然那里的链接已经死了,但它并没有涉及猫鼬。所以我希望我的问题不会被标记为重复。
【问题讨论】:
-
除了 mongoose 导入本质上是“包装类型”之外,并没有任何本质区别,正如您引用的代码中所示,这基本上与“类型转换”有关,因为各种 mongoose方法允许您指定一个“字符串”值,然后该值将在内部“强制转换”为
ObjectID。要点是Schema.Types.ObjectId对定义的猫鼬模式意味着某些东西。但是底层数据(实际上是实际的实现)是完全一样的。 -
但是 mongo ObjectID 和 ObjectId 一样吗?
-
是的,它是一样的。正如您在代码中看到的,导入来自作为库的“bson”。在核心驱动程序中也是如此。回到您引用的答案,随着时间的推移,所有语言实现都将核心驱动程序中的“BSON”部分作为单独的依赖项分离出来。事实上,用于 JavaScript 的 BSON 库甚至在浏览器中也能正常工作。所以没有区别,只是在不同的上下文中“实现”了通用库方法。