2016-05-23 11 views
0

私はUser modelを定義しました。このモデルには2つのリストがあり、ユーザーが好きな項目の1つと、ユーザーが嫌っている項目の1つです。
1人のユーザーが認定していない(好き嫌いをしていない)項目と、他のユーザーが行った項目のリストが必要です。私はNodeJSのためのマングースライブラリともlodash(_)ライブラリを使用しています、 私のコードは次のようになります。Mongooseを使用したMongoDBの大きなクエリ

function itemsUserHasntQualified(var user){ 
    items = []; 
    User.find().exec(function(err, users){ 
    for(var user_it: users){ 
     if(user_it != user){ 
     items.push(_.difference(user_it.tracks.liked, user_it.tracks.disliked, user.tracks.liked, user.tracks.disliked); 
     } 
    } 
    }); 
} 

これは、Userのスキーマです:

var UserSchema = new Schema({ 
    name: String, 
    username: {type: String, lowercase:true }, 
    email: { type: String, lowercase: true }, 
    role: { 
    type: String, 
    default: 'user' 
    }, 
    hashedPassword: String, 
    provider: String, 
    salt: String, 
    facebook: {}, 
    twitter: {}, 
    google: {}, 
    github: {}, 
    tracks: { 
    liked: [{type:Schema.ObjectId, ref: "Track"}], 
    disliked: [{type:Schema.ObjectId, ref: "Track"}], 
    later: [{type:Schema.ObjectId, ref: "Track"}] 
    } 
}); 

しかし、実際にはIこれが正しい方法ではないと感じています。 これより簡単で正確なクエリ方法がありますか?

+0

スキーマを追加できますか? –

+0

作成したばかりの編集を確認する – sant016

答えて

0

は私が正しいとして分類かわからないんだけど、あなたは、少なくとも、コレクション全体を返さずにMongoDBの中のクエリの大部分を実行することができます。

であるMongoose Query#distinctは、別個の配列項目を返し、クエリを提供することができます。

User.distinct('tracks.disliked', { username: { $ne: username } }) 
User.distinct('tracks.liked', { username: { $ne: username } }) 

これは、あなたlikeddislikedのための配列を与え、どのあなたは、ユーザーのための違いをすることができます。

UserSchema.methods.itemsUserHasntQualified = function() { 
    var user = this 
    var liked = User.distinct('tracks.liked', { username: { $ne: user.username } }) 
    var disliked = User.distinct('tracks.disliked', { username: { $ne: user.username } }) 

    Promise.all([liked, disliked]).then(function (results) { 
    var all_ratings = _.union(results[0], results[1]) 
    var users_ratings = _.union(user.tracks.liked, user.tracks.disliked) 
    var missing = _.difference(users_ratings, all_ratings) 
    return missing 
    }) 
} 

はあなたのアクセスパターンに応じて、それほど頻繁に、このコレクションは、どこか別のスキャンを実行し、itemsUserHasntQualifiedでの使用のための配列結果をキャッシュする場合があります。

関連する問題