2017-12-04 2 views
0

Ich habe eine Liste von Objekten, die ich in eine Sammlung einfügen möchte. Die mongoTemplate.insert(list); funktioniert gut, aber jetzt möchte ich es zu upsert(); ändern, da meine Liste doppelte Objekte enthalten kann, die bereits in einer Sammlung eingefügt sind. Also, was ich will, ist die gesamte Liste einzufügen und unterwegs zu überprüfen, ob das Objekt bereits in der Sammlung vorhanden ist, dann überspringen Sie es sonst einfügen Sie es.Spring MongoTemplate vollständige Liste nach oben

Antwort

0

können Sie versuchen, continueOnError oder ordered Flag wie folgt aus:

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

OR,

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

Sie benötigen einen unique Indexfeld des Objekts id erstellen (wenn es keine eindeutige Einschränkung). So dass es Fehler macht, während Sie versuchen, unter Verwendung derselben id einzufügen.

Verwenden die eindeutige Einschränkung Sie array einfügen oder mit BulkInsert

Für insert indem man einen Flag gesetzt continueOnError: true kann die Insertion weiterhin kann, wenn Fehler aufgrund eindeutiger Einschränkung im Fehlerfall festgestellt, während bestehenden id des Objekts einzufügen.

+0

Ich habe einen eindeutigen Index für mein Mongo-Client erstellt. –

+0

Ok. Also folge einfach der Flagge zum Einfügen! – Zico

+0

'mongoTemplate.bulkOps (BulkOperations.BulkMode.UNORDERED, MyClass.class); mongoTemplate.insert (list); 'Ich habe das versucht, funktioniert aber nicht. –

0

Der einzige Weg, um einen Bulk-Upsert Betrieb zu tun, ist das Verfahren MongoCollection.bulkWrite (oder zumindest: der einzige Weg, ich weiß ... ;-))

es nutzen zu können, müssen Sie Ihre Dokumente konvertieren das entsprechende WriteModel: für upsert auf einer pro-Dokument-Basis ist dies 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); 

(Haftungsausschluss: Ich habe nur getippt diesen Code, habe ich nie lief es)

Verwandte Themen