2017-01-07 3 views
1

나는 n 초 단위로 파일 시스템을 검색하여 콜렉션에 저장하는 작업을 가지고 있습니다.Java mongodb (morphia)는 고유 한 문서를 보장합니다.

나는 데이터베이스에서 동일한 파일로 두 번 끝나지 않도록하는 최선의 방법이 확실하지 않습니다. 현재 파일의 절대 경로를 가져 와서 데이터베이스의 다른 절대 경로에 대해 확인 중입니다.

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

null을 반환하면 저장하고 저장하십시오.

각 파일을 데이터베이스와 비교하여 확인하는 것이 가장 좋은 방법입니까? 나는 다음과 같은 인덱스 주석을 사용하여 시도했지만 작동하지 않는 것 내가

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

빨리 내가 ​​확인하고있어 이전의 방법보다 (내가이 일을 얻을 수있는 가정)인가요 중복으로 끝낼 중복에 대해?

+0

파일을 나타내는 Java 값 객체를 디자인 할 수 있습니다. 중복 된 파일을 쉽게 감지 할 수 있도록 해시 코드 및 메서드를 구현합니다. – Hector

+0

해시 코드와 함께 파일 pojo를 이미 가지고 있는데, 그게 당신이 참조하는 것인가? 그런데 어떻게 몽고와 함께 사용할 수 있을까요? –

+0

한 가지 방법은 파일의 절대 경로를 _id로 사용하는 것입니다. 중복 된 항목이 될 수는 없지만, 고유 한 인덱스가있는 올바른 방법을 사용하는 것 외에는 다른 이유가 있습니다. 중복 된 항목은 내부로 들어갈 수 없습니다. 하지만 고유 인덱스는 대소 문자를 구분하지 않습니다 afaik –

답변

1

고유성 제약 조건이 fileNameabsolutePath 모두이므로 인덱스가 작동하지 않습니다. absolutePath에만 별도의 색인에 대한 고유 제한 조건이 필요합니다.

Morphia에서 업서 트를 수행하려면 here으로 인스턴스를 datastore.update()으로 전달하면됩니다. UpdateOptions에는 true을 전달하는 upsert(boolean)이 있습니다.

+0

고맙습니다.이 말이 맞습니다. 삽입 된 복제물이 없는지 확인하는 두 가지 옵션 (또는 세 번째 옵션) 중 더 정확한 방법은 무엇인지에 대한 통찰력이 있습니까? –

+0

솔직히, 당신이하고있는 일이 단지 길을 로깅하는 것이라면, 나는 삽입을 시도하고 복제 예외를 잡아라. – evanchooly

0

컬렉션에도 파일 경로를 저장할 수 있으며 파일 경로에 고유 인덱스가있을 수 있습니다. 컬렉션에 새 파일을 추가하려면 파일 경로에서 upsert를 수행 할 수 있습니다.

+0

저는 이미 내 질문에 따라 경로를 저장하고 있습니다. 당신은 morphia로 upsert를 어떻게 수행합니까? –