玉模板代码
each member in team.members
if member == user._id
- flag=true;
这里,团队是Mongo DB中“团队”集合中的文档,“成员”是一个以数组为值的属性。
此处#{member}的值分别为53fecc27bace957811633dcc
和5412a08fa51c105017b9f1fe
。两者都是Object Id。
#{user.id}的值为53fecc27bace957811633dcc
但是,此比较返回false,而flag永远不会设置为true。 为什么会这样?
答案 0 :(得分:3)
为澄清而编辑:
mongodb-native驱动程序使用自定义ObjectID类型。即使ObjectID相同,member
和user._id
仍然会引用两个不同的对象,因此比较失败。
以下是我所谈论的简化示例。在下面的示例中,我有一个TestObject
的构造函数(模拟mongo ObjectID
)。我使用相同的参数实例化两个对象(即x1
和x2
)。虽然x1
和x2
是同一对象的实例,并且两者都是使用相同的参数创建的,但它们实际上只是具有相同数据/有效负载的两个不同对象。因此,第一次直接比较失败,因为它们实际上并不相同。为了进一步模拟,我添加了一个原型方法.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;
答案 1 :(得分:1)
MongoDB objectIds可能不是简单的字符串。根据{{3}},它们是BSON类型。 成员和user._id可能是两个不同的对象,这就是“引用等于”比较失败的原因,即使它们的字符串表示是相同的。
在相关的说明中,在应用程序中使用MongoDB生成的对象ID是个坏主意。更健壮的设计是为每种记录类型设置自己的标识符。