Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 比较ObjectID';在翡翠和蒙哥达_Mongodb_Variables_Comparison_Pug_Objectid - Fatal编程技术网

Mongodb 比较ObjectID';在翡翠和蒙哥达

Mongodb 比较ObjectID';在翡翠和蒙哥达,mongodb,variables,comparison,pug,objectid,Mongodb,Variables,Comparison,Pug,Objectid,翡翠模板代码 each member in team.members if member == user._id - flag=true; 这里,team是Mongo DB中集合“teams”中的一个文档,“members”是一个以数组为值的属性 #{member}的值分别为53fecc27bace957811633dcc和5412a08fa51c105017b9f1fe。两者都是对象Id #{user.id}的值是53fecc27bace95781163

翡翠模板代码

    each member in team.members
      if member == user._id
       - flag=true;  
这里,team是Mongo DB中集合“teams”中的一个文档,“members”是一个以数组为值的属性

#{member}的值分别为
53fecc27bace957811633dcc
5412a08fa51c105017b9f1fe
。两者都是对象Id

#{user.id}的值是
53fecc27bace957811633dcc

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

MongoDB对象可能不是简单的字符串。根据,它们是BSON类型。 可能member和user.\u id是两个不同的对象,这就是为什么“reference equals”比较失败的原因,即使它们的字符串表示形式相同

与此相关的是,在应用程序中使用MongoDB生成的对象ID不是一个好主意。更稳健的设计是为每种记录类型都有自己的标识符。

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

mongodb本机驱动程序使用自定义ObjectID类型。即使objectid相同,
member
user.\u 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
.equal()
方法:

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

对于前面的场景不起作用的原因,我们将不胜感激。我假设您使用的是Mongoose,它使用mongodb本机驱动程序。mongodb本机驱动程序使用自定义ObjectID类型。即使objectid相同,
成员
和用户。_id`引用两个不同的对象,因此比较失败。比较这些自定义对象的方法只有两种:(1)使用
.equals()
方法(例如
成员.equals(user.\u id)
),或者(2)使用我在上面的回答中演示的
.toString()
。因此,如果我在另一个对象中存储对象id,比如x,你的意思是说x不再是objectid?Aniket Lawande想说什么,虽然这两个对象仍然是objectid,但就Mongoose而言,它们代表相同的objectid,就JavaScript(因此Jade)而言,它们是两个不同的对象,即使它们具有相同的类型和相同的负载(ObjectID参考)。我编辑了我的原始答案,用一个简单的自定义对象模拟问题。
each member in team.members
  if member.equals(user._id)
   - flag=true;