Se la tua domanda è:
Posso passare la stringa sopra nel driver Java e farla eseguire dal driver?
Allora potresti utilizzare il comando db.eval. Ad esempio:
MongoDatabase database = mongoClient.getDatabase("...");
Bson command = new Document("eval", "db.orders.aggregate([\n" +
" {\n" +
" $unwind: \"$specs\"\n" +
" },\n" +
" {\n" +
" $lookup:\n" +
" {\n" +
" from: \"inventory\",\n" +
" localField: \"specs\",\n" +
" foreignField: \"size\",\n" +
" as: \"inventory_docs\"\n" +
" }\n" +
" },\n" +
" {\n" +
" $match: { \"inventory_docs\": { $ne: [] } }\n" +
" }\n" +
"])");
Document result = database.runCommand(command);
Ma ... il db.eval
il comando è deprecato e il suo utilizzo non è consigliato. Il driver Java MongoDB può essere utilizzato per eseguire la tua aggregazione ma non nella sua "forma di stringa", invece dovresti utilizzare gli helper di aggregazione del driver Java per creare una forma Java del tuo comando di aggregazione. Molti dettagli su questo nei documenti.
Ecco un esempio (non testato) che utilizza un driver Java 3.x MongoDB ...
MongoCollection<Document> collection = mongoClient.getDatabase("...").getCollection("...");
AggregateIterable<Document> documents = collection.aggregate(Arrays.asList(
// the unwind stage
new Document("$unwind", "$specs"),
// the lookup stage
new Document("$lookup", new Document("from", "inventory")
.append("localField", "specs")
.append("foreignField", "size")
.append("as", "inventory_docs")),
// the match stage
new Document("$match", new Document("inventory_docs", new BasicDBObject("$ne", new String[0])))
));
.. questo potrebbe aiutarti a vedere la forma di traduzione dallo script della shell a Java.