比较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()方法)将完成这项工作。