265

我有一个 node.js 应用程序,它提取一些数据并将其粘贴到一个对象中,如下所示:

var results = new Object();

User.findOne(query, function(err, u) {
    results.userId = u._id;
}

当我根据存储的 ID 执行 if/then 时,比较永远不会正确:

if (results.userId == AnotherMongoDocument._id) {
    console.log('This is never true');
}

当我对两个 id 进行 console.log 时,它们完全匹配:

User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002

我假设这是某种数据类型问题,但我不确定如何将 results.userId 转换为会导致上述比较成立的数据类型,而我的外包大脑(又名 Google)一直无法提供帮助。

4

7 回答 7

454

Mongoose 使用 mongodb-native 驱动程序,该驱动程序使用自定义 ObjectID 类型。您可以将 ObjectID 与.equals()方法进行比较。以你的例子,results.userId.equals(AnotherMongoDocument._id). ObjectID 类型也有一个toString()方法,如果您希望以 JSON 格式或 cookie 存储 ObjectID 的字符串化版本。

如果您使用ObjectID = require("mongodb").ObjectID(需要 mongodb-native 库),您可以results.userId使用results.userId instanceof ObjectID.

等等。

于 2012-07-24T19:38:21.100 回答
74

ObjectIDs 是对象,所以如果你只是将它们与==你比较它们的引用。如果要比较它们的值,则需要使用以下ObjectID.equals方法:

if (results.userId.equals(AnotherMongoDocument._id)) {
    ...
}
于 2012-07-24T19:38:07.513 回答
29

将对象 id 转换为字符串(使用 toString() 方法)将完成这项工作。

于 2017-03-28T10:27:01.793 回答
11

根据以上,我找到了解决问题的三种方法。

  1. AnotherMongoDocument._id.toString()
  2. JSON.stringify(AnotherMongoDocument._id)
  3. results.userId.equals(AnotherMongoDocument._id)
于 2019-02-21T04:00:29.230 回答
8

接受的答案确实限制了您可以对代码执行的操作。例如,您将无法Object Ids使用 equals 方法搜索数组。相反,总是转换为字符串并比较键会更有意义。

如果您需要indexOf()在引用数组中检查特定 ID,这是一个示例答案。假设query是您正在执行的查询,假设someModel是您正在寻找的 id 的 mongo 模型,最后假设results.idList是您正在寻找对象 id 的字段。

query.exec(function(err,results){
   var array = results.idList.map(function(v){ return v.toString(); });
   var exists = array.indexOf(someModel._id.toString()) >= 0;
   console.log(exists);
});
于 2016-05-24T18:58:26.773 回答
6

这里建议的三种可能的解决方案具有不同的用例。

  1. .equals在像这样比较两个 mongoDocuments 上的 ObjectId 时使用
results.userId.equals(AnotherMongoDocument._id)
  1. .toString()在将 ObjectId 的字符串表示形式与 mongoDocument 的 ObjectId 进行比较时使用。像这样
results.userId === AnotherMongoDocument._id.toString()
于 2020-01-16T18:58:03.823 回答
2

我遇到了完全相同的问题,我只是在以下帮助下解决了这个问题JSON.stringify():-

if (JSON.stringify(results.userId) === JSON.stringify(AnotherMongoDocument._id)) {
        console.log('This is never true');
}
于 2018-07-21T17:59:58.623 回答