2016-09-07 2 views
0

J'ai une collection de vidéos:Mongoose: trier les résultats de la requête par moins occurences de mot dans la matrice

var VideoSchema = new mongoose.Schema({ 
    url: { 
    type: String, required : true 
    }, 
    orderBy: { 
    type: Number 
    }, 
    views: [{ 
    type: String 
    }] 
}); 

« orderBy » me permet de définir l'ordre dans lequel je sers vidéos

« vues » est une liste de noms d'utilisateurs, ceux qui ont regardé la vidéo.

Je souhaite empêcher les utilisateurs de regarder à nouveau la même vidéo jusqu'à ce qu'ils aient regardé toutes les vidéos de la collection. Donc, je garde les noms des utilisateurs qui ont regardé la vidéo dans les «vues».

Maintenant, je demande des vidéos en utilisant 'trier'.

return this.find(videoQuery) 
.skip(offset) 
.limit(count || 10) // @todo 10 : param 
.sort({views: {$meta: username}, 'orderBy': -1}) 
.exec(); 

Et je reçois le message d'erreur:

Can't canonicalize query: BadValue bad sort specification 

Pouvez-vous aider?

+0

Je crois que je ne peux utiliser que 'textScore' comme valeur pour $ meta, et donc il est inutile pour mon utilisation: les paramètres dans la requête ne sont pas ceux que je veux 'textScore', je veux juste le nom d'utilisateur. J'ai cherché des heures mais je n'arrive pas à trouver une solution sur mongodb docs. – user6403833

Répondre

0

Peut-être tort, mais à partir docs mongo. Lorsque vous spécifiez $ meta dans le tri, vous devez l'inclure dans forecastFieldName.

https://docs.mongodb.com/manual/reference/operator/projection/meta/#proj._S_meta

il devrait donc ressemble à quelque chose comme ça

return this.find(videoQuery, { views: { $meta: 'textScore' } }) .skip(offset) .limit(count || 10) // @todo 10 : param .sort({views: {$meta: textScore}, 'orderBy': -1}) .exec();

MISE À JOUR Il semble que meta $ accepte seulement 'textScore' comme mentionné @Pierre.

Donc, une autre suggestion consiste à utiliser le trait de soulignement ou js natif pour trier les données lorsque la réponse provient de DB. Ce sera moins efficace et peut nécessiter quelques ajustements, mais cela fonctionnera définitivement.

Espérons que cela aide.

+0

Merci, vous m'avez fait un pas de plus. J'ai une nouvelle erreur: Impossible de canonicaliser la requête: BadValue non supporté $ meta operator: 'nom d'utilisateur' Je crois que je ne peux utiliser que 'textScore' comme valeur pour $ meta, et donc c'est inutile pour mon utilisation: les paramètres dans requête ne sont pas ceux que je veux 'textScore', je veux juste le nom d'utilisateur. J'ai cherché des heures mais je n'arrive pas à trouver une solution sur mongodb docs. – user6403833

+0

Eh bien, si c'est le cas que son mauvais et $ Meta opérateur a besoin de plus de fonctionnalités (((. –

+0

Btw..Peut-être vous les trier lorsque la réponse vient de DB .. Avec JS je pense que ce sera très facile, en utilisant underscore. ou js natif. –