Si tu pregunta es:
¿Puedo pasar la cadena anterior al controlador Java y hacer que el controlador la ejecute?
Entonces podrías use el comando db.eval. Por ejemplo:
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);
Pero ... el db.eval
El comando está en desuso y no se recomienda su uso. El controlador MongoDB Java se puede usar para ejecutar su agregación, pero no en su 'forma de cadena'; en su lugar, usaría los ayudantes de agregación del controlador Java para crear una forma Java de su comando de agregación. Muchos detalles sobre esto en los documentos.
Aquí hay un ejemplo (no probado) usando un controlador Java MongoDB 3.x...
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])))
));
.. esto podría ayudarlo a ver la forma de traducción del script de shell a Java.