How to fire mongo native queries using java-mongo-driver only.
No Spring-Data or EclipseLink or Hibernate OGM, Only using java-mongo-driver
Sample query :
db.orders.aggregate([
{
$unwind: "$specs"
},
{
$lookup:
{
from: "inventory",
localField: "specs",
foreignField: "size",
as: "inventory_docs"
}
},
{
$match: { "inventory_docs": { $ne: [] } }
}
])
By “native query”, are you referring to a JavaScript query in the mongo shell? The Java driver provides a full interface for querying MongoDB. To get started, see MongoDB Java Driver Quick Start and the Java Driver Tutorials. Here is an example with “native” query usage.
To connect: MongoClient client = MongoClients. create("<<MongoDB URI>>"); To connect to MongoDB on your local instance and default port, you can just omit the URI part of the above, or use a URI like 'mongodb://localhost:27017'.
Before you start using MongoDB in your Java programs, you need to make sure that you have MongoDB CLIENT and Java set up on the machine. You can check Java tutorial for Java installation on your machine. Now, let us check how to set up MongoDB CLIENT. You need to download the jar mongodb-driver-3.11.
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<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])))
));
.. this might help you to see the form of translation from shell script to Java.
I was running out of time so used following workaround. Will explore Morcos suggestion in detail later. But following code also works.
import com.infrasoft.mongo.MongoClientFactory;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.CommandResult;
import com.mongodb.DB;
import com.mongodb.DBObject;
import com.mongodb.util.JSON;
/**
*
* @author charudatta.joshi
*/
public class TestNaiveQuery1 {
public static void main(String[] args) {
String nativeQuery = "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"
+ "])";
DBObject command = new BasicDBObject();
DB db = MongoClientFactory.getMongoClientFactory().getMongoClient().getDB("frms_data_demo");
nativeQuery = "function() { return (" + nativeQuery + ").toArray(); }";
//command.put("eval", "function() { return db." + collectionName + ".find(); }");
command.put("eval", nativeQuery);
CommandResult result = db.command(command);
BasicDBList dbObjList = (BasicDBList) result.toMap().get("retval");
DBObject dbo0 = (BasicDBObject) dbObjList.get(0);
DBObject dbo1 = (BasicDBObject) dbObjList.get(0);
System.out.println(dbObjList.get(0));
System.out.println(dbObjList.get(1));
// .... just loop on dbObjList
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With