2016-06-29 17 views
1

私はタグの配列を含む文書の束を持っている:を計算し、最も一般的な配列要素

{ tags: ["tag1", "tag2", "tag3"] } 

私が何をしたいのですが、何がすべての文書の中で使用され、トップ10の最も一般的なタグを計算することです。しかし、私はそれを行うには、このかなり面倒な方法であること(クエリの最適化の私の限られた知識で)「感じる」

r.db("database").table("table").concatMap(function(doc) { 
    return doc("tags") 
}).coerceTo("array").group(function(entry) { 
    return entry 
}).count().ungroup().orderBy(r.desc("reduction").limit(10).map(function(doc) { 
    return doc("group") 
}) 

:いくつかの試行錯誤の後、私は、次の解決策を作ってみました。インデックスを適切に使用して効率的なアプローチを提案する人はいますか?

答えて

0

coerceTo('array')を除いて、このクエリは私にとってはうまく見えますが、これは私が必要と思わないものであり、パフォーマンスにおそらく影響します。あなたはかなり短くすることもできます:

r.table('table').group('tags', {multi: true}).count().ungroup().orderBy('reduction').slice(-10)('group') 
+0

ありがとう!マルチインデックスをうまく利用。あなたの答えに '.orderBy(r.desc(" reduction "))'がありません。実際に 'slice(-10)'と 'limit(10)'にはパフォーマンス上の違いがありますか? – GlurG

+0

ああ、ええ、私は 'orderBy'を忘れました。私は 'r.desc'を中止しました。 'slice(-10)'は最初の10個の要素の代わりに最後の10個の要素を取ります。ここで配列上で操作しているので、効率的でなければなりません。 – mlucy

関連する問題