2017-01-07 9 views
1

私はすべてn秒のファイルシステムをスキャンしてコレクションに保存する秒を実行します。Java mongodb(morphia)はユニークな文書を保証します

私は、データベース内で同じファイルを2回使用しないようにするための最善の方法はわかりません。現時点では私は、ファイルの絶対パスを取って、これはnullを返した場合、他の絶対パスに対して、データベース内の

public Movie findByAbsolutePath(String absolutePath) { 
    return getDatastore().find(Movie.class, "absolutePath", absolutePath).limit(1).get(); 
} 

はその後、先に行くと、保存することを確認しています。

このように、各ファイルをデータベースと照合してチェックするのが最適ですか?私がチェックしています、以前の方法よりも早くは(私はそれが仕事を得ることができます仮定して)ということです私は、次のインデックスアノテーションを使用してみましたが、それは動作するようには思えないし、私は重複

@Indexes(@Index(fields = {@Field("fileName"), @Field("absolutePath")}, options = @IndexOptions(unique = true, dropDups = true))) 

で終わります重複に対して?

+0

ファイルを表すJavaバリューオブジェクトを設計することができます。重複したファイルを簡単に検出できるように、ハッシュコードと同等のメソッドを実装します。 – Hector

+0

ハッシュコードを持つファイルpojoを既に持っていて、それがあなたが参照しているのであれば、メソッドと同じですか?しかし、私はどのようにそれをモンゴーと一緒に使うのですか? –

+0

私は1つの方法は、ファイルの絶対パスを_idとして使用することです、それは決して重複したエントリではありませんが、あなたは一意のインデックスを持っている正しい方法であると思われる以外の理由はほとんどありません重複するエントリが内部に入ることはありません。ユニークなインデックスは大文字と小文字を区別しませんafaik –

答えて

1

一意制約がfileNameabsolutePathの両方にあるため、インデックスが機能しません。 absolutePath単独の個別のインデックスには一意制約が必要です。

Morphiaでupsertを実行するにはhereと書かれているようにUpdateOptionsインスタンスをdatastore.update()に渡します。 UpdateOptionsにはがあり、それにはtrueを渡すだけです。

+0

ありがとう、これは正しいです。重複が挿入されていないことを確認する2つのオプション(または3つ目のオプション)のより正確な方法は何ですか? –

+0

正直なところ、あなたがやっているのは、単にパスを記録しているだけなのですが、私は挿入を試み、重複の例外をキャッチ/無視します。 – evanchooly

0

コレクションにファイルパスも保存でき、ファイルパスに一意のインデックスを持つことができます。コレクションに新しいファイルを追加する場合は、ファイルパス上でupsertを実行できます。

+0

私はすでに私の質問に従ってパスを保存しています。あなたはモルフィアでどのようにアップサーットをしますか? –

関連する問題