2016-05-23 15 views
0

Ich habe eine User model definiert. Dieses Modell hat zwei Listen, eine der Elemente, die der Benutzer gemocht hat, und die andere ist die Elemente, die der Benutzer nicht mochte.
Ich brauche eine Liste der Elemente, die ein Benutzer nicht qualifiziert (weder gemocht noch nicht) und die anderen Benutzer haben. Ich bin die Mungo-Bibliothek für NodeJS mit und auch die lodash (_) Bibliothek, mein Code sieht wie folgt aus:Große Abfrage in MongoDB mit Mongoose

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); 
     } 
    } 
    }); 
} 

Dies ist das Schema für die 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"}] 
    } 
}); 

Aber eigentlich habe ich Ich fühle, dass dies nicht der richtige Weg ist. Gibt es eine einfachere oder korrektere Möglichkeit, dies abzufragen?

+0

Können Sie Ihr Schema hinzufügen? –

+0

Überprüfen Sie die Bearbeitung, die ich gerade gemacht habe – sant016

Antwort

0

Ich bin mir nicht sicher, was als korrekt klassifiziert, aber Sie können mindestens den Großteil der Abfrage in Mongodb ausführen, ohne die gesamte Sammlung zurückgeben.

Mongoose Query#distinct welche ist db.collection.distinct() wird verschiedene Array-Elemente zurückgeben und kann eine Abfrage geliefert werden.

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

Dies gibt Ihnen die Arrays für liked und disliked, die Sie dann Unterschied für einen Benutzer.

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 
    }) 
} 

Je nach Zugriffsmuster, möchten Sie vielleicht diese Sammlung laufen woanders scannen, weniger häufig und die Array-Ergebnisse für den Einsatz in itemsUserHasntQualified zwischenzuspeichern.

Verwandte Themen