22

以下是一个示例模型:

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...
    })
})

在这种情况下,user.friends 中的条件“about.id”似乎总是错误的。如何?这与 ObjectId 的类型或它的保存方式有关吗?

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

4

3 回答 3

47

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

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

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

您不能使用更简单的方法,indexOf因为您想按值而不是按引用比较 ObjectID。

于 2013-11-02T01:57:13.420 回答
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
}
于 2014-08-07T18:46:59.523 回答
-3

我相信这是一个 javascript 问题,而不是 Node.js/Mongoose 问题 - 所以它确实不属于现在的样子。

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

无论如何,答案在堆栈溢出时可用,以检查元素在数组中的位置 —</p>

user.friends.indexOf(about.id) > -1
于 2013-11-02T01:06:24.003 回答