2017-12-04 7 views
0

私はコレクションに挿入したいオブジェクトのリストを持っています。 mongoTemplate.insert(list);はうまくいきましたが、コレクションに既に挿入されている重複したオブジェクトをリストに含めることができるように、upsert();に変更します。だから、私が望むのは、リスト全体を挿入し、アイテムがすでにコレクションに存在するかどうかをチェックし、それを挿入しないようにすることです。Spring MongoTemplate upsert list全体

答えて

0

あなたはこのようcontinueOnErrorまたはorderedフラグを試してみることができます:

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

OR、

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

一意の制約が存在しない場合は、あなたのオブジェクトのid(のuniqueインデックスフィールドを作成する必要があります)。そのため、同じidを使用して挿入しようとするとエラーが発生します。一意性制約を使用

あなたはエラーがエラーの場合に見出されるたびに、オブジェクトの既存のidを挿入しながらためのユニークな制約の挿入を継続することができるフラグcontinueOnError: trueを設定することができるinsertを使用するためarray又はBulkInsert

を使用して挿入します。

+0

私は私のmongoクライアント上で作成した一意のインデックスを持っています。 –

+0

だから、ちょうど挿入するフラグに従ってください! – Zico

+0

'mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED、MyClass.class); mongoTemplate.insert(list); '私はこれを試しましたが動作しません。 –

0

バルクアップサート操作を行うための唯一の方法は、メソッド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); 

(免責事項:私はにこのコードを入力、私はそれを走ったことがない