How to execute MongoDB native query (JSON) using mongo-java-driver only?

前端 未结 4 1229
南方客
南方客 2020-12-18 07:12

How to fire mongo native queries using java-mongo-driver only.

No Spring-Data or EclipseLink or Hibernate OGM, Only using

4条回答
  •  [愿得一人]
    2020-12-18 07:52

    If your question is:

    Can I pass the above string into the Java driver and have the driver execute it?

    Then you could use the db.eval command. For example:

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

    But ... the db.eval command is deprecated and its usage is not advised. The MongoDB Java driver can be used to execute your aggregation but not in its 'string form', instead you would use the Java driver's aggregation helpers to create a Java form of your aggregation command. Plenty of details on this in the docs.

    Here's an (untested) example using a 3.x MongoDB Java Driver ...

    MongoCollection collection = mongoClient.getDatabase("...").getCollection("...");
    
    AggregateIterable 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])))
    ));
    

    .. this might help you to see the form of translation from shell script to Java.

提交回复
热议问题