比较猫鼬_id和字符串


197

我有一个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)无法提供帮助。

Answers:


359

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

如果使用ObjectID = require("mongodb").ObjectID(需要mongodb-native库),则可以使用来检查是否results.userId为有效标识符results.userId instanceof ObjectID

等等。



4
如果您已经在使用mongoose,就可以require('mongoose').mongo.ObjectID不必列出其他依赖项
JoshuaDavid

62

ObjectIDs是对象,因此,如果您仅将它们与==引用进行比较。如果要比较它们的值,则需要使用以下ObjectID.equals方法:

if (results.userId.equals(AnotherMongoDocument._id)) {
    ...
}

17

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


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);
});

1
let exists = results.idList.filter(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor).length ? true : false
单线

4
@Zlatko我不是新语法的忠实拥护者,而是每个人都喜欢。
r3wt

2
@Zlatko const exists = results.idList.some(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor)const exists = results.idList.some(val => val.equals(someModel._id))
axanpi

1
这些年来@Zlatko,猜猜是什么。我希望您现在使用您的版本。介意我以适当的归因将其添加到答案中吗?
r3wt

1
进步的代价:)当然,您可以使用答案,它的目的是在可能的情况下提供替代方案或帮助。
Zlatko '18 -4-4

6

综上所述,我找到了解决问题的三种方法。

  1. AnotherMongoDocument._id.toString()
  2. JSON.stringify(AnotherMongoDocument._id)
  3. results.userId.equals(AnotherMongoDocument._id)

0

我遇到了完全相同的问题,我只是借助以下方法解决了该问题JSON.stringify():-

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

0

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

  1. 在两个像这样的mongoDocuments上比较ObjectID时使用.equals

    results.userId.equals(AnotherMongoDocument._id)

  2. 将ObjectID的字符串表示形式与mongoDocument的ObjectID进行比较时,请使用.toString()。像这样

    results.userId === AnotherMongoDocument._id.toString()


第三种可能的解决方案是什么?
克里斯·卡蒂尼亚尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.