下划线:比较mongoose objectIds失败

时间:2013-01-05 11:39:24

标签: mongoose underscore.js

我无法比较mongoose ObjectId或它们的String值。

我有两个数组,第一个是:

a = [
"50dfb24123c43a501400000e",
"50d1bda330eb531c1400000d",
"50d1bdcf30eb531c1400000f",
"50d1beac30eb531c14000012",
"50dfb26223c43a501400000f"
]

,第二个是:

b = [
"50dfb26223c43a501400000f"
]

正在运行_.intersection(a,b)会为我提供一个空数组[],而不是b中的值。

a和b的值是由Mongoose模型返回的结果_.pluck编辑的。 我已经尝试将每个数组值转换为字符串,但我仍然得到相同的空数组结果。

我搜索了类似的问题,但我发现的解决方案没有帮助(即转换为字符串)。

我有什么遗失的吗?我知道问题是Mongoose ObjectIds,因为如果我将上面粘贴的原始数组相交,我会得到正确的结果。

由于

3 个答案:

答案 0 :(得分:5)

在lodash4中,您现在可以执行此操作:

_.intersectionWith(a, b, _.isEqual)

答案 1 :(得分:1)

在这种情况下,您不能将_.intersectionObjectId的数组一起使用,因为intersection使用简单的引用相等来比较元素,而不是比较它们的内容。要比较两个ObjectId的相等性,您需要使用ObjectId.equals方法。

所以最简单的解决方案是将数组转换为字符串,以便intersection可以工作。我知道你说你试过了,但你可能在某个地方有一个错误,因为它确实有效。

答案 2 :(得分:1)

您可以使用_.isEqual(object,other)来测试2个mongoose ObjectID是否具有相同的内容。

例如,

var ret=[];
_.each(b,function(x){
    ret.push(_.filter(a,function(y){
        return _.isEqual(x,y);
    }))
})

现在,你应该把ret包含“50dfb26223c43a501400000f”作为Mongoose的ObjectId的数据类型。