【问题标题】:What is the difference between mongo ObjectID, ObjectId & Mongoose ObjectIdmongo ObjectID, ObjectId & Mongoose ObjectId 有什么区别
【发布时间】: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 库甚至在浏览器中也能正常工作。所以没有区别,只是在不同的上下文中“实现”了通用库方法。

标签: node.js mongodb mongoose


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-10-31
    • 2016-04-28
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2012-08-20
    • 2022-12-07
    • 1970-01-01
    相关资源
    最近更新 更多