2016-04-12 3 views
0

Ich habe diesen Mongo-Shell-Befehl, den ich in Java-Code konvertieren muss. Sieht aus wie die Treiber-API so oft ändert, dass alle Beispiele, die ich online sehe, diese Methode nicht verwenden. Ich benutze die neueste Version 3.2.4 des Treibers.Wie verwende ich die AggregateToCollectionOperation-Klasse von Java Mongodb?

db.ff1987_2gram.aggregate([ 
    { 
     $group: { 
      _id : { 
       "cw1" : "$cw1", 
       "target" : "$target" 
      }, 
      "count" : {"$sum" : 1 } 
     } 
    }, 
    {$out : "ff1987_2gram_c"} 
], { allowDiskUse:true}) 

https://api.mongodb.org/java/3.2/com/mongodb/operation/AggregateToCollectionOperation.html hat was ich tun möchte. Aber seine Ausführungsmethode benötigt ein WriteBinding-Schnittstellenobjekt. Dies wird durch ClusterBinding, SingleServerBinding implementiert. Aber ich benutze keines von beiden. Ich habe mit der neuen MongoClient-Klasse eine Verbindung zur Datenbank hergestellt.

Antwort

0

Während dies meine ursprüngliche Frage nicht beantwortet, ist das folgende eine anständige Problemumgehung. Ich denke, dies ist eine veraltete Klasse, seit MongoClient eingeführt wurde.

Anstatt die AggregateToCollectionOperation zu verwenden, verwenden Sie eine normale Aggregationsoperation mit einer der Stufen mit $ out, genau wie im Befehl mongo shell. Beachten Sie jedoch, dass der Befehl nicht ausgeführt wird, wenn Sie das zurückgegebene iterable nicht iterieren. (Es könnte ausreichen, nach dem ersten Element zu brechen. Wird aktualisiert, nachdem ich das überprüft habe). Ein Beispiel unten.

List<Document> pipeline = new ArrayList<>(); 
... 
Document group = new Document("$group", groupargs); 
pipeline.add(group); 
... 
//Relevant line 
pipeline.add(new Document("$out", collectionname)); 
AggregateIterable<Document> docs = db.getCollection(collection).aggregate(pipeline).allowDiskUse(true); 
for (Document d : docs) {}