MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment exécuter la requête native MongoDB (JSON) en utilisant uniquement mongo-java-driver ?

Si votre question est :

Puis-je transmettre la chaîne ci-dessus au pilote Java et faire en sorte que le pilote l'exécute ?

Alors vous pourriez utilisez la commande db.eval. Par exemple :

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);

Mais ... le db.eval La commande est obsolète et son utilisation n'est pas conseillée. Le pilote Java MongoDB peut être utilisé pour exécuter votre agrégation, mais pas sous sa "forme de chaîne", à la place, vous utiliserez les assistants d'agrégation du pilote Java pour créer une forme Java de votre commande d'agrégation. Beaucoup de détails à ce sujet dans la documentation.

Voici un exemple (non testé) utilisant un pilote 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])))
));

.. cela pourrait vous aider à voir la forme de traduction du script shell vers Java.