当前位置: 首页 > 面试题库 >

猫鼬:ObjectId比较不一致地失败

澹台胜
2023-03-14
问题内容

我有一个简单的工具来构建文档集合,然后自动格式化它们以进行EPUB或LaTeX渲染,该工具写在ExpressJS之上。我正在使用Coffeescript,如果那很重要(我对此表示怀疑)。

使用猫鼬,我有以下几点:

DocumentSchema = new Schema
    title:     String

Offrefs = new Schema
    ref:       { type: ObjectId }
    isa:       String

BinderSchema = new Schema
    title:     String
    contains:  [Offrefs]

Offrefs没有指定它的含义,因为我希望能够在其他活页夹中包含一些活页夹,以创建逻辑集合:“这些用于打印机”,“这些用于epub”,“这些仅用于Web,
”等等。(我已经剔除了所有杂项。)

不幸的是,我遇到了查询,其中检索对象

(story._id == offref.ref) -> True

两者确实看起来相同。但:

(binder._id == offref.ref) -> False
(String(binder._id) == String(offref.ref)) -> True

对最后两个中的两个引用进行视觉比较,它们 相同的ID号,但是ObjectId对象无法正确比较。

我不想经常进行字符串转换,当我将这些复杂的对象转换为数据树时,这是很可能的。树关系在任何数据库中都是熊。在MongoDB中,它们应该不难。

您如何在MongoDB中比较ObjectId?


问题答案:

直接==(或===)比较将通过引用而不是值来比较两个对象。因此,只有当它们都引用同一实例时,它们的结果才为true。

相反,您应该使用的equals方法ObjectID比较它们的值:

story._id.equals(offref.ref)

正如@bendytree在注释中指出的那样,如果两个值中的任何一个都可以为null(并且您希望null进行比较),那么可以改用以下内容:

String(story._id) === String(offref.ref)


 类似资料:
  • 我有一个node.js应用程序,它提取一些数据并将其粘贴到对象中,如下所示: 当我基于存储的ID执行if/then时,比较永远不会为真: 当我对两个id执行console.log时,它们完全匹配: 我假设这是某种类型的数据类型问题,但我不确定如何将results.userId转换为一种数据类型,这将导致上述比较结果为真,而我的外包大脑(也称谷歌)也无法提供帮助。

  • 问题内容: 我有一个node.js应用程序,它可以提取一些数据并将其粘贴到对象中,如下所示: 当我基于存储的ID执行if / then时,比较永远不会成立: 当我执行两个ID的console.log时,它们完全匹配: 我以为这是某种数据类型问题,但是我不确定如何将result.userId转换为数据类型,从而导致上述比较正确,而我的外包大脑(又名Google)无法提供帮助。 问题答案: Mongo

  • 问题内容: 我想用Mongoose 生成一个MongoDB 。有没有办法从Mongoose 访问构造函数? 这个问题是关于从头开始 产生新的 。生成的ID是全新的通用唯一ID。 另一个问题是关于从 现有的字符串表示形式 创建一个。在这种情况下,您已经具有ID的字符串表示形式(它可能是通用的也可能不是唯一的),并且正在将其解析为。 问题答案: 您可以在找到构造函数。这是一个例子: 是一个新生成的。

  • 问题内容: 我试图在猫鼬中指定我的数据库的架构。目前,我这样做: 我创建模式并尝试保存一些数据。 错误: 我根据以下代码编写了此代码:http : //mongoosejs.com/docs/populate.html#gsc.tab=0 我怎样才能解决这个问题? 问题答案: 您引用的猫鼬文档中的示例用于该字段以及其他字段。 我假设他们在示例中这样做是为了证明可以使用其中任何一个。如果未在架构中指

  • 问题内容: 我正在使用mongoose使用Node.js,Express和MongoDB构建CRUD风格的REST服务。此服务将允许已经存在的android应用程序的用户在线上载/同步其单个数据库的内容。 已经存在的应用程序的数据模型使用UUID(用Java生成),该UUID与较短的单调MongoDB样式字段冲突。由于数据模型已经存在,并且填充了许多用户的数据,因此无法将源数据转换为单调的Mong

  • 问题内容: 我正在尝试在架构之间建立某种关系,而解决方案存在一些问题。这是我的设备架构: 这里是房间模式: 猫鼬抛出错误 类型错误:未定义的类型,在 你尝试筑巢的架构?您只能使用引用或数组进行嵌套。 如果我更改为一切正常。您能解释一下为什么会这样吗? 问题答案: 是构造函数,要在模式定义中使用的是(或)。 所以应该看起来像这样: