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.

19
demandé sur p0lAris 2013-11-02 04:06:45

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.

34
répondu JohnnyHK 2013-11-02 13:41:15

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
}
3
répondu gperreymond 2014-08-07 20:53:20

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
-3
répondu p0lAris 2013-11-02 01:06:24