2017-08-28 8 views
0

私のアプリで友達コンポーネントを構築しようとしています。mongoose schema/query

私はまだMongo/MongooseがMySQLのバックグラウンドから来ているのはかなり新しいです。

私がここでやろうとしているのは、ユーザーのプロフィールにアクセスすることと、そのユーザーのプロフィールに自分のページにアクセスしているユーザーが友だちであるかどうかを確認するプライベート設定があるかどうかです。

は、私はこれが唯一のreq.params.username OR req.session.user.idを持つ任意のIDを持つすべてのユーザ名を検索するのではなく、見つけるかのように私は感じるユーザースキーマ

var UserSchema = new Schema({ 
username  : String, 
friends  : [{ id: { type: Schema.Types.ObjectId, ref: 'User'}, status: Number }], 
}); 

var User   = mongoose.model('User', UserSchema); 

User.findOne({username: 'req.params.username', 'friends.id': req.session.user.id}, function (err, user) 
if(user){ 
    user.isFriend = true; 
} 
}); 

を持っていると仮定しますreq.session.user.idがそのユーザーの友人の配列に含まれているかどうかを確認してください。

これを行うには良い方法がありますか?

MySQLの場合、username = 'something'の場合は 'users'から選択し、その結果を確認して、その結果の友人データにidが存在するかどうかを確認します。

答えて

1

クエリが存在する場合は、常に_id: usernameによってドキュメントが返されます。あなたがする必要があるのはfriendsフィールドをフェッチし、それをループしてidが存在するかどうかを調べることです。また、集約を使用した簡単なクエリも機能します。

User.aggregate([{$match: {_id: req.params.username, 
           'friends.id': req.session.user.id}}, 
        {$project: {friends: {$filter: { 
                input: '$friends', 
                as: 'fr', 
                cond: {$eq: ['$$fr.id', req.session.user.id]} 
                } 
             } 
           } 
        } 
        ]); 

上記一の項目に配列を返すと、一つの項目は、所与の一つがfriendsリストに存在する場合順番に一つだけidからなることでfriends配列を有するべきです。

注:req.session.user.idSchema.Types.ObjectIdである必要があります。