2016-03-22 18 views
1

Ich habe eine Datei in mongoDB zu speichern. Was ich will, ist zu vermeiden, die ganze Datei (die mehrere MBs groß sein könnte) zu laden, stattdessen möchte ich den Stream öffnen und ihn an mongoDB richten, um die Schreiboperation performant zu halten. Es macht mir nichts aus, den Inhalt in base64 codiertem Byte [] zu speichern.Stream in mongoDB schreiben in Java

Danach möchte ich das gleiche zum Zeitpunkt des Lesens der Datei, d. H. Nicht die gesamte Datei im Speicher zu laden, stattdessen lesen Sie es in einem Stream.

Ich benutze derzeit Hibernate-Ogm mit Vertx-Server, aber ich bin offen, um zu einer anderen API zu wechseln, wenn es die Ursache effizient verwaltet.

Ich möchte tatsächlich ein Dokument mit mehreren Feldern und mehreren Anlagen speichern.

Antwort

2

Sie können GridFS verwenden. Vor allem, wenn Sie größere Dateien speichern müssen (> 16 MB) ist dies die empfohlene Methode:

File f = new File("sample.zip"); 
GridFS gfs = new GridFS(db, "zips"); 
GridFSInputFile gfsFile = gfs.createFile(f); 
gfsFile.setFilename(f.getName()); 
gfsFile.setId(id); 
gfsFile.save(); 

Oder falls Sie eine Input in:

GridFS gfs = new GridFS(db, "zips"); 
GridFSInputFile gfsFile = gfs.createFile(in); 
gfsFile.setFilename("sample.zip"); 
gfsFile.setId(id); 
gfsFile.save(); 

Sie eine Datei laden, kann man von der Verwendung GridFS.find Methoden:

GridFSDBFile gfsFile = gfs.findOne(id); 
InputStream in = gfsFile.getInputStream(); 
+0

Danke für die Antwort. Kann dieser Ansatz auch für Dokumente mit weniger als 16 MB verwendet werden? Ich erwarte nichts über 8 MB für meinen Anwendungsfall. –

+1

Sicher, es kann für Dateien beliebiger Größe verwendet werden. – Sebastian

+0

Danke, Entschuldigung für das ständige Abhören. Wahrscheinlich war ich nicht klar in meiner Frage, aber ich habe auch einige Felder in meinem Dokument zusammen mit der Anhangsdatei. Wäre es möglich, einige andere Felder im selben Dokument zu haben? wie Name, Betreff, etc. –