一尘不染

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

node.js

我有一个简单的工具来构建文档集合,然后自动格式化它们以进行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?


阅读 243

收藏
2020-07-07

共1个答案

一尘不染

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

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

story._id.equals(offref.ref)

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

String(story._id) === String(offref.ref)
2020-07-07