質問の場合:
上記の文字列をJavaドライバーに渡して、ドライバーに実行させることはできますか?
次に、できた db.evalコマンドを使用します。例:
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);
しかし ... db.eval
コマンドは非推奨であり、その使用はお勧めしません。 MongoDB Javaドライバーを使用して集計を実行できますが、「文字列形式」では使用できません。代わりに、Javaドライバーの集計ヘルパーを使用して集計コマンドのJava形式を作成します。これに関する詳細はドキュメントにたくさんあります。
これは、3.x MongoDB Javaドライバーを使用した(テストされていない)例です...
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])))
));
..これは、シェルスクリプトからJavaへの変換の形式を確認するのに役立つ場合があります。