web-dev-qa-db-ja.com

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 in user.friends」は常にfalseのようです。どうやって?これはObjectIdのタイプまたはそれが保存される方法と関係がありますか?

注:ObjectIdSchema.ObjectIdの略です。それ自体が問題かどうかはわかりません。

20
p0lAris

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を返します。

ObjectIDを参照ではなく値で比較するため、indexOfのような単純なものは使用できません。

41
JohnnyHK

私は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
gperreymond