Jade 模板代码
each member in team.members
if member == user._id
- flag=true;
这里,team是Mongo DB中“teams”集合中的一个文档,“members”是一个以数组为值的属性。
这里#{member}的值分别是53fecc27bace957811633dcc
和5412a08fa51c105017b9f1fe
。两者都是对象 ID。
#{user.id} 的值为 53fecc27bace957811633dcc
但是,此比较返回 false 并且 flag 从未设置为 true。 为什么会这样?
最佳答案
为了清晰起见进行了编辑:
mongodb-native 驱动程序使用自定义 ObjectID 类型。即使 ObjectID 相同,member
和 user._id
仍然引用两个不同的对象,因此比较失败。
这是我所讨论内容的一个简化示例。在下面的示例中,我有一个 TestObject
的构造函数(模拟 mongo ObjectID
)。我使用相同的参数实例化两个对象(即 x1
和 x2
)。虽然 x1 和 x2 是同一对象的实例,并且都是使用相同的参数创建的,但它们实际上只是具有相同数据/有效负载的两个不同对象。因此,第一次直接比较失败了,因为它们实际上并不相同。为了进一步进行模拟,我添加了一个原型(prototype)方法 .equals()
,它确保两个对象都是 TestObject 的实例并且有效负载相同。
function TestObject(data) {
this.payload = data;
}
TestObject.prototype.equals = function(anotherObject) {
return (anotherObject instanceof TestObject) && (this.payload === anotherObject.payload);
};
var x1 = new TestObject(1), x2 = new TestObject(1);
console.log(x1 == x2); // <-- false
console.log(x1.equals(x2)); // <-- true
您可以通过将 ObjectID 转换为字符串来比较它们。
each member in team.members
if member.toString() == user._id.toString()
- flag=true;
另一种可能的解决方案是使用 ObjectId .equal()
方法:
each member in team.members
if member.equals(user._id)
- flag=true;
关于mongodb - 比较 Jade 和 MongoDB 中的 ObjectID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26060265/