以下はモデルの例です。
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のタイプまたはそれが保存される方法と関係がありますか?
注:ObjectId
はSchema.ObjectId
の略です。それ自体が問題かどうかはわかりません。
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
のような単純なものは使用できません。
私は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
}