比较mongoose_id和string

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

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

当我做一个if /那么基于存储的ID,比较从来就不是真的:

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

当我做了两个ID的console.log,他们完全匹配:

 User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002 

我假设这是某种数据types的问题,但我不知道如何将results.userId转换为一个数据types,将导致上述比较是真实的,我的外包大脑(又名谷歌)一直无法帮助。

Mongoose使用使用自定义ObjectIDtypes的mongodb本地驱动程序。 您可以将ObjectID与.equals()方法进行比较。 用你的例子, results.userId.equals(AnotherMongoDocument._id) 。 ObjectIDtypes也有一个toString()方法,如果你想存储JSON格式的ObjectIDstring版本,或者一个cookie。

如果使用ObjectID = require("mongodb").ObjectID (需要mongodb本地库),您可以检查results.userId是否为带有results.userId instanceof ObjectID的有效标识符。

等等。

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

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

接受的答案确实限制了你可以用你的代码做什么。 例如,您将无法使用equals方法searchObject Ids数组。 相反,总是强制转换string并比较键是更有意义的。

如果您需要使用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); }); 

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