2016-09-07 2 views
0

У меня есть коллекция видео:Mongoose: сортировать результаты запросов по мере вхождений слова в массиве

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

«OrderBy» позволяет мне определить порядок, в котором я служу видео

«вид» является список имен пользователей, тех, кто просмотрел видео.

Я хочу, чтобы пользователи не просматривали снова одно и то же видео, пока не просмотрели все видео в коллекции. Поэтому я сохраняю имена пользователей, которые смотрели видео внутри «просмотров».

Теперь я запрашиваю видео, используя 'sort'.

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

И я получаю сообщение об ошибке:

Can't canonicalize query: BadValue bad sort specification 

Можете ли вы помочь?

+0

Я считаю, что я могу использовать только «textScore» как значение для $ meta, и поэтому он бесполезен для моего использования: параметры в запросе не те, которые я хочу «textScore», я просто хочу имя пользователя. Я искал часы, но я не могу найти решение на документах mongodb. – user6403833

ответ

0

Возможно, это неправильно, но из документов mongo. Когда вы укажете $ meta в сортировке, вам нужно включить ее в projectedFieldName.

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

Так это должно выглядеть примерно так

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

Обновлено Кажется, что $ мета принимает только 'textScore', как указано @Pierre.

Так что еще одно предложение - использовать символы подчеркивания или родные js для сортировки данных, когда ответ приходит от БД. Это будет менее эффективным и может потребоваться некоторые корректировки, но это будет работать определенно.

Надеюсь, это поможет.

+0

Спасибо, ты сделал еще один шаг. У меня возникла новая ошибка: Can noticalize query: BadValue unsupported $ meta operator: 'username' Я считаю, что я могу использовать только «textScore» как значение для $ meta, и поэтому это бесполезно для моей usecase: параметры в запрос не те, что я хочу для textScore, я просто хочу имя пользователя. Я искал часы, но я не могу найти решение на документах mongodb. – user6403833

+0

Ну, если это так, как его плохой, а $ meta-оператор нуждается в большей функциональности (((.) –

+0

Btw..Мы можем сортировать их, когда ответ приходит от БД .. С JS я думаю, что это будет довольно легко, используя подчеркивание. или native js. –

Смежные вопросы