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