2017-12-04 14 views
0

나는 컬렉션에 삽입하려는 개체 목록이 있습니다. mongoTemplate.insert(list); 잘 작동하지만 지금은 upsert();으로 수정하고 싶습니다. 내 목록에는 이미 컬렉션에 삽입 된 복제 개체가 포함될 수 있습니다. 그래서 내가 원하는 것은 전체 목록을 삽입하고 이동 중에는 항목이 컬렉션에 이미 있는지 확인한 다음 삽입하지 않으면됩니다.봄 MongoTemplate 전체 목록을 upsert

답변

0

이 같은 continueOnError 또는 ordered 플래그를 시도 할 수 있습니다 :

db.collection.insert(myArray, {continueOnError: true}) 

OR,

db.collection.insert(myArray, {ordered: false}) 
0

을 당신의 unique 인덱스 필드를 만들 필요가 개체의 id (어떤 고유 제한 조건이없는 경우). 동일한 id을 사용하여 삽입하려고하면 오류가 발생합니다.

당신이 array 삽입 고유 제한 조건을 사용하거나 개체의 id 기존 삽입하는 동안 오류가 있기 때문에 고유 제한 조건의 오류가 발생하는 경우에 발견 할 때마다 삽입을 계속할 수있는 플래그 continueOnError: true을 설정할 수 있습니다 insert을 사용하기 위해 BulkInsert

를 사용하여.

+0

(면책 조항 난 단지 내가를 실행하지 ,이 코드를 입력). –

+0

확인. 그런 다음 깃발을 따라 삽입하면됩니다. – Zico

+0

'mongoTemplate.bulkOps (BulkOperations.BulkMode.UNORDERED, MyClass.class); mongoTemplate.insert (list);'시도했지만 작동하지 않았습니다. –

0

대량-upsert 작업을 할 수있는 유일한 방법은 방법 MongoCollection.bulkWrite (또는 적어도 : 내가 아는 유일한 방법 ... ;-))

를 사용하려면, 당신이 문서를 변환해야 해당 WriteModel : 문서 당 기준으로 업서스의 경우 UpdateOneModel입니다.

List<Document> toUpdate = ...; 
MongoCollection coll = ...; 

// Convert Document to UpdateOneModel<Document> 
List<UpdateOneModel<Document>> bulkOperationList = toUpdate.stream() 
    .map(doc -> new UpdateOneModel<Document>(
     Filters.eq("_id", doc.get("_id")), // identify by same _id 
     doc, 
     new UpdateOptions().upsert(true))) 
    .collect(Collectors.toList()); 

// Write to DB 
coll.bulkWrite(bulkOperationList); 

: 내 몽고 클라이언트에서 생성 된 고유 인덱스를