mongoose - 检查数组中是否存在ObjectId

时间:2013-11-02 00:06:46

标签: node.js mongodb mongoose contains

以下是一个示例模型:

UserModel == {
    name: String,
    friends: [ObjectId],
}

friends对应于某些其他模型的id个对象列表,例如AboutModel

AboutModel == {
    name: String,
}

User.findOne({name: 'Alpha'}, function(error, user){
    About.find({}, function(error, abouts){ // consider abouts are all unique in this case
        var doStuff = function(index){
            if (!(about.id in user.friends)){
                user.friends.push(about.id);
                about.save();
            }
            if (index + 1 < abouts.length){
                doStuff(index + 1)
            }
        }
        doStuff(0) // recursively...
    })
})

在这种情况下,条件'about.id in user.friends`似乎总是假的。怎么样?这与ObjectId的类型或它的保存方式有关吗?

注意:ObjectIdSchema.ObjectId的缩写;我不知道这本身是不是一个问题。

3 个答案:

答案 0 :(得分:38)

如果about.id是ObjectID的字符串表示形式且user.friends是ObjectID数组,则可以使用Array#some检查数组中是否about.id

var isInArray = user.friends.some(function (friend) {
    return friend.equals(about.id);
});

some调用将遍历user.friends数组,在每个数组上调用equals以查看它是否与about.id匹配,并在找到匹配后立即停止。如果找到匹配项,则返回true,否则返回false

您不能使用像indexOf这样简单的内容,因为您希望按值比较ObjectID,而不是通过引用。

答案 1 :(得分:3)

我使用lo-dash并做类似的事情:

var id_to_found = '...';
var index = _.find(array, function(ch) {
     return ch == id_to_found ;
});
if ( index!=undefined ) {
     // CHILD_ALREADY_EXISTS
} else {
     // OK NOT PRESENTS
}

答案 2 :(得分:-3)

我认为这是一个javascript问题,而不是Node.js / Mongoose问题 - 所以它实际上不属于现在的方式。

此外,about.id in user.friends的问题是about.id指向的对象和user.friends中的对象不同;我相信in会检查对象是否相等。

无论如何,在堆栈溢出时可以得到答案,以检查数组中元素的存在位置 -

user.friends.indexOf(about.id) > -1