比较Jade和MongoDB中的ObjectID

时间:2014-09-26 13:02:43

标签: mongodb variables comparison pug objectid

玉模板代码

    each member in team.members
      if member == user._id
       - flag=true;  

这里,团队是Mongo DB中“团队”集合中的文档,“成员”是一个以数组为值的属性。

此处#{member}的值分别为53fecc27bace957811633dcc5412a08fa51c105017b9f1fe。两者都是Object Id。

#{user.id}的值为53fecc27bace957811633dcc

但是,此比较返回false,而flag永远不会设置为true。 为什么会这样?

2 个答案:

答案 0 :(得分:3)

为澄清而编辑:

mongodb-native驱动程序使用自定义ObjectID类型。即使ObjectID相同,memberuser._id仍然会引用两个不同的对象,因此比较失败。

以下是我所谈论的简化示例。在下面的示例中,我有一个TestObject的构造函数(模拟mongo ObjectID)。我使用相同的参数实例化两个对象(即x1x2)。虽然x1x2是同一对象的实例,并且两者都是使用相同的参数创建的,但它们实际上只是具有相同数据/有效负载的两个不同对象。因此,第一次直接比较失败,因为它们实际上并不相同。为了进一步模拟,我添加了一个原型方法.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是个坏主意。更健壮的设计是为每种记录类型设置自己的标识符。