sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo ejecutar la consulta nativa MongoDB (JSON) usando solo mongo-java-driver?

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.