mongoose-vérifier si ObjectId existe dans un tableau
voici un exemple de modèle:
UserModel == {
name: String,
friends: [ObjectId],
}
friends
correspond à une liste de id
des objets d'un autre modèle, par exemple 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...
})
})
dans ce cas, la condition est d'environ.id dans user.les amis semblent toujours être faux. Comment? Est-ce lié au type D'ObjectId ou à la façon dont il est sauvegardé?
Remarque: ObjectId
est l'abréviation de Schema.ObjectId
; je ne sais pas si c'est un problème en soi.
3 réponses
Si about.id
est une représentation string D'un ObjectID et user.friends
est un tableau de ObjectIDs, vous pouvez vérifier si about.id
est dans le tableau en utilisant Array#some
:
var isInArray = user.friends.some(function (friend) {
return friend.equals(about.id);
});
some
appel d'itérer sur les user.friends
array, appelant equals
sur chacune pour voir si elle correspond about.id
et arrêter dès qu'elle trouve une correspondance. S'il trouve une correspondance, il retourne true
sinon false
.
Vous ne pouvez pas utiliser quelque chose de plus simple comme indexOf
parce que vous voulez comparer les objectifs par valeur, pas par référence.
j'utilise lo-tableau de bord et faire quelque chose comme ça :
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
}
je crois que c'est une question javascript plutôt qu'un noeud.js / Mangoose question-donc il n'a pas vraiment sa place dans la façon dont il est actuellement.
Aussi, le problème avec about.id in user.friends
c'est que l'objet pointé par about.id
et objets user.friends
sont différents; et je crois in
vérifie l'égalité de l'objet.
quoi qu'il en soit, la réponse est disponible sur stack overflow pour vérifier où un élément existe dans un tableau -
user.friends.indexOf(about.id) > -1