我有一个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

我假设这是某种数据类型问题,但我不确定如何转换结果。userId转换为一个数据类型,这将导致上述比较是正确的,我的外包大脑(又名谷歌)一直无法提供帮助。


当前回答

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

在两个mongodocument上比较ObjectId时使用.equals

results.userId.equals(AnotherMongoDocument._id)

在比较ObjectId的字符串表示和mongoDocument的ObjectId时使用. tostring()。像这样

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

其他回答

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

猫鼬从5到6的迁徙指南:

“猫鼬现在添加valueOf()函数到ObjectIds。这意味着你现在可以使用==来比较ObjectId和字符串。”

https://mongoosejs.com/docs/migrating_to_6.html#objectid-valueof

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

在两个mongodocument上比较ObjectId时使用.equals

results.userId.equals(AnotherMongoDocument._id)

在比较ObjectId的字符串表示和mongoDocument的ObjectId时使用. tostring()。像这样

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

公认的答案确实限制了您可以用代码做的事情。例如,不能使用equals方法搜索Object id数组。相反,总是强制转换为字符串并比较键会更有意义。

如果您需要使用indexOf()在引用数组中检查特定id,这里有一个示例答案。假设query是您正在执行的查询,假设someModel是您正在寻找的id的mongo模型,最后假设结果。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);
});

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

AnotherMongoDocument._id.toString () JSON.stringify (AnotherMongoDocument._id) results.userId.equals (AnotherMongoDocument._id)