2012-02-01 10 views
3

mongoコレクション内の潜在的に何百万ものドキュメント間のフィールドを比較したいと考えています。フィールドは事前に決定され、各フィールドに重みが与えられます。これらの重みは、「好きな」ドキュメントの提案を表すドキュメントペアを返すために使用されます。たとえば、2つのドキュメントが比較されていて、両方が 'first_name'フィールドに同じ値を持つ場合、ウェイトテーブルが参照され、ペアのスコアにそのウェイトが追加されます。 2つのフィールドの間で別のフィールドが同じ場合、スコアはより高い類似性を反映するように更新されます。MongoDB内のドキュメントの比較

私は現在、最初の結果セットを反復処理し、結果セットを通過し、各ドキュメントを最初のイテレータがある(非常に非効率的な)ドキュメントと比較する埋め込み反復処理を行っています。これは現在、カーソルを介して要素をつかむので、phpによってすべて行われます。

私はO(n^2)の複雑さで今働いているので、MapReduceの実装(実際には適用されないようです)、カーソルの操作、プロセスを単純化するために思い描くことができるものは何でも(これまでのところ、最初のイテレータでカバーされていたドキュメントはスキップしています)。

答えて

0

n^2を避けるには、参照コレクションにフィールドとその値を格納する必要があります。 :

{ 
    field: "firstName", 
    value: "Remon", 
    documents : [ <list with all document _ids of documents that have "field" set to "value">] 
} 

この方法で、このコレクションを直接クエリして、ソースドキュメントに似ているすべてのドキュメントを取得できます。さらに、これにより、単一のO(n)クエリで複数のキー/値ペアをクエリできます。

当然のことながら、このリファレンスコレクションは最初は維持されていますが、あなたの場合はかなり簡単です(フィールドの更新時に参照を更新する)。

これは役に立ちますか?

+0

私は設定もかなり似ていましたが、これを維持するために追加のコレクションを作成することを避けたいと考えていましたが、これは私が行かなければならないルートにもっと似ています。入力いただきありがとうございます。 – Ghjnut

関連する問題