我有一个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转换为数据类型,这将导致上述比较为真,我的外包大脑(又称谷歌)已无法帮助
答案 0 :(得分:294)
Mongoose使用mongodb-native驱动程序,该驱动程序使用自定义ObjectID类型。您可以将ObjectID与.equals()
方法进行比较。以您的示例results.userId.equals(AnotherMongoDocument._id)
为例。如果您希望以JSON格式存储ObjectID的字符串化版本或Cookie,则ObjectID类型也有toString()
方法。
如果您使用ObjectID = require("mongodb").ObjectID
(需要mongodb-native库),您可以检查results.userId
是否为results.userId instanceof ObjectID
的有效标识符。
等
答案 1 :(得分:55)
ObjectID
是对象,因此如果您只是将它们与==
进行比较,那么您需要比较它们的引用。如果要比较它们的值,则需要使用ObjectID.equals
方法:
if (results.userId.equals(AnotherMongoDocument._id)) {
...
}
答案 2 :(得分:12)
将对象id转换为字符串(使用toString()方法)将完成这项工作。
答案 3 :(得分:8)
接受的答案确实限制了您可以对代码执行的操作。例如,您将无法使用equals方法搜索Object Ids
数组。相反,总是强制转换为字符串并比较密钥会更有意义。
如果您需要使用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);
});
答案 4 :(得分:2)
根据上述内容,我找到了解决问题的三种方法。
AnotherMongoDocument._id.toString()
JSON.stringify(AnotherMongoDocument._id)
results.userId.equals(AnotherMongoDocument._id)
答案 5 :(得分:0)
我遇到了完全相同的问题,我只是在JSON.stringify()
的帮助下解决了该问题,如下所示:-
if (JSON.stringify(results.userId) === JSON.stringify(AnotherMongoDocument._id)) {
console.log('This is never true');
}
答案 6 :(得分:0)
此处建议的三种可能的解决方案具有不同的用例。
在比较两个像这样的mongoDocuments上的ObjectID时使用.equals
results.userId.equals(AnotherMongoDocument._id)
在将ObjectID的字符串表示形式与mongoDocument的ObjectID进行比较时,请使用.toString()。像这样
results.userId === AnotherMongoDocument._id.toString()