Mongoose:ObjectId比较失败不一致

Elf*_*erg 29 mongoose mongodb node.js

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

使用Mongoose,我有以下内容:

DocumentSchema = new Schema
    title:     String

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

BinderSchema = new Schema
    title:     String
    contains:  [Offrefs]
Run Code Online (Sandbox Code Playgroud)

Offrefs没有指定它所引用的内容,因为我希望能够在其他绑定器中包含一些绑定器,以创建逻辑集合:"这些是用于打印机","这些是用于epub","这些只是web, "等等(我把所有杂项都删掉了.)

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

(story._id == offref.ref) -> True 
Run Code Online (Sandbox Code Playgroud)

这两个确实看起来一样.但:

(binder._id == offref.ref) -> False
(String(binder._id) == String(offref.ref)) -> True
Run Code Online (Sandbox Code Playgroud)

并且最后两个中两个引用的视觉比较,它们相同的ID号,但是ObjectId对象没有正确比较.

我不想不断地进行字符串转换,这在我将这些复杂对象转换为数据树时非常有可能.树关系是任何数据库中的熊; 他们在MongoDB中应该不难.

你如何在MongoDB中进行ObjectId比较?

Joh*_*yHK 85

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

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

story._id.equals(offref.ref)
Run Code Online (Sandbox Code Playgroud)

正如@bendytree在评论中指出的那样,如果任一值都可以为null(并且您希望空值比较相等),那么您可以使用以下代码:

String(story._id) === String(offref.ref)
Run Code Online (Sandbox Code Playgroud)

  • 是的,没有文档的功能. (10认同)
  • 不幸的是,如果id为null,则抛出`.equals()`抛出.`String(...)== String(...)`似乎是最安全的选择. (7认同)