Mongoose - проверить, существует ли ObjectId в массиве

Ниже приведен пример модели:

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 в user.friends" кажется всегда ложным. Как? Это связано с типом ObjectId или способом его сохранения?

Примечание: ObjectId не подходит для Schema.ObjectId; Я не знаю, была ли эта проблема сама по себе.

Ответы

Ответ 1

Если 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, потому что вы хотите сравнить ObjectIDs по значению, а не по ссылке.

Ответ 2

Я использую 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
}

Ответ 3

Я считаю, что это вопрос javascript, а не вопрос Node.js/Mongoose, поэтому он действительно не принадлежит тому, как он сейчас находится.

Кроме того, проблема с about.id in user.friends заключается в том, что объект, на который указывает about.id и объекты в user.friends, различны; и я считаю, что in проверяет равенство объекта.

В любом случае, ответ доступен для, чтобы проверить, существует ли элемент в массиве -

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