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
(模拟mongoObjectID
)的构造函数。我用相同的参数实例化两个对象(即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;