2016-09-07 1 views
0

における単語の最小出現箇所によってソートクエリの結果、私はビデオのコレクションを持っている:マングース:配列

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

「ORDERBYは、」私はビデオを提供する順序を定義することができますが

の意見」ですユーザ名のリスト、ビデオを見た人。

コレクション内のすべての動画を視聴するまで、ユーザーが同じ動画を再視聴しないようにします。だから私は、ビューの内部でビデオを見たユーザーの名前を保持します。

ここでは、「並べ替え」を使用して動画をクエリします。

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

私は$ metaの値として 'textScore'しか使用できないと思うので、私の使用目的には無用です:クエリのパラメータは 'textScore'には必要ではありません。 私は何時間も探しましたが、mongodbドキュメントの解決策が見つからないようです。 – user6403833

答えて

0

mongo docsから間違っている可能性があります。ソートで$ 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();

のようなものは@Pierreが述べたように$メタは、のみ 'textScore' を受け入れるようです。

もう一つの提案は、応答がDBから来たときにデータをソートするためにアンダースコアまたはネイティブjを使用することです。これは効率が悪く、調整が必要な場合もありますが、これは確実に機能します。

これが役に立ちます。

+0

おかげさまで、私は一歩前進しました。私は新しいエラーが発生しました:クエリを正規化できません:BadValueはサポートされていません$ meta operator: 'username' $ metaの値として 'textScore'しか使用できないと私は考えています。クエリは私が 'textScore'にしたいものではありません、私はちょうどユーザー名が欲しいです。 私は何時間も探しましたが、mongodbドキュメントの解決策が見つからないようです。 – user6403833

+0

それは悪いと$メタ演算子よりも多くの機能が必要な場合(((((。 –

+0

Btw ..あなたが応答をDBから来るときに並べ替えるかもしれません..JSと私はそれが非常に簡単だろうと思う、アンダースコアを使用します。 。またはネイティブjs。 –