mongodb - 比较 Jade 和 MongoDB 中的 ObjectID

标签 mongodb variables comparison pug objectid

Jade 模板代码

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

这里,team是Mongo DB中“teams”集合中的一个文档,“members”是一个以数组为值的属性。

这里#{member}的值分别是53fecc27bace957811633dcc5412a08fa51c105017b9f1fe。两者都是对象 ID。

#{user.id} 的值为 53fecc27bace957811633dcc

但是,此比较返回 false 并且 flag 从未设置为 true。 为什么会这样?

最佳答案

为了清晰起见进行了编辑:

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

这是我所讨论内容的一个简化示例。在下面的示例中,我有一个 TestObject 的构造函数(模拟 mongo ObjectID)。我使用相同的参数实例化两个对象(即 x1x2)。虽然 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/

相关文章:

java - 比较两个复杂的字符串数组列表

mongodb mongoose maxDistance 单位

MongoDB $or/$and 命令优化

java - 在 Java 中计算包含变量的字符串形式的表达式

javascript - var myVar = ""和有什么区别和 var myVar;?

python - 将变量直接分配给Python中的函数

regex - 正则表达式之间的距离

MongoDB 没有从 ubuntu 16.04 开始

mongodb - 如何根据条件 $push 一个字段?

java - Java 6 在 JDK、JVM 或两者中的性能改进是什么?