I run the following query command in mongodb robo command:
db.getCollection('t_data').find({"mid":123456,"datetime":{"$gte" : "2016-09-01" , "$lte" : "2016-9-12"}})
and it takes about 2 sec to return 10000 records.
howerver,when I put it in java to execute,it takes several minutes to return data (10000 records).there is an index on mid and datetime with {mid:1,datetime:1}.the java code of the query is as follows:
......
DBObject query = new BasicDBObject();
DBObject timeObj = new BasicDBObject();
timeObj.put("$gte", "2016-09-01");
timeObj.put("$lte", "2016-09-12");
query.put("mid", 123456);
query.put("datetime", timeObj);
DBObject queryField = new BasicDBObject();
queryField.put("pdid", true);
queryField.put("data", true);
queryField.put("datetime", true);
DBCollection coll = queryService.getCollection('t_data');
DBCursor dbcoursor= coll.find(query,queryField);//only this coding line takes serveral minutes.
while(dbcoursor.hasNext()) {
......
}
......
so what is the difference betwwen running in java and mongodb command,the query criteria is same,but the query performance is very different,and how could I improve the query performance in java.
Related
The following query in the mongoDB shell
db.getCollection('Consolidated Records').find({'timestamp': {$gte: 1500000036316, $lte:1500001136316}})
is working and returns several records.
The same query in Java as follows:
long firstTimestamp = 1500000036316L;
long lastTimestamp = 1500001136316L;
BasicDBObject query = new BasicDBObject("timestamp", new BasicDBObject("$gte", firstTimestamp).append("$lte", lastTimestamp));
DBCursor oneDayCursor = collection.find(query);
doesn't return any results when called on the same DB collection.
Any idea what is wrong with the Java code?
What is the version of MongoDB ?
If you are using 3.x you could use below code
FindIterable<Document> findCursor = newCol.find(Filters.and(
Filters.gte("firstTimestamp", firstTimestamp),
Filters.lte("lastTimestamp ", lastTimestamp )));
MongoClient mongo = new MongoClient();
DB db = mongo.getDB("mytest");
DBCollection col = db.getCollection("testt");
//read example
DBObject query = BasicDBObjectBuilder.start("$gte", "06/01/2016 00:00:00").add("$lte", "10/01/2016 00:00;00").get();
DBCursor cursor = col.find(query);
while(cursor.hasNext()) {
System.out.println("docc:");
System.out.println(cursor.next());
}
I am getting below exception while selecting data from MongoDB in Java.
com.mongodb.MongoQueryException: Query failed with error code 2 and
error message 'unknown top level operator: $gte' on server
127.0.0.1:27017 at com.mongodb.operation.FindOperation$1.call(FindOperation.java:493) at
com.mongodb.operation.FindOperation$1.call(FindOperation.java:483) at
com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:241)
at
com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:214)
at
com.mongodb.operation.FindOperation.execute(FindOperation.java:483)
at com.mongodb.operation.FindOperation.execute(FindOperation.java:80)
at com.mongodb.Mongo.execute(Mongo.java:818) at
com.mongodb.Mongo$2.execute(Mongo.java:805) at
com.mongodb.DBCursor.initializeCursor(DBCursor.java:851) at
com.mongodb.DBCursor.hasNext(DBCursor.java:152) at
MongoFetch.main(MongoFetch.java:55)
Well you query does not mention the field you are querying on - just the range, therefore mongoDB does not really know what to do. Try something like that
...
BasicDBObject query = new BasicDBObject();
query.put("yourDateField", BasicDBObjectBuilder.start("$gte", fromDate).add("$lte", toDate).get());
DBCursor cursor = col.find(query);
...
I need a Java driver mongo query for and/or combination -
for ex -
suppose I have a collection user have 3 field named a, b, c.
Now I have to perform find query like -
user.find({$and :[{"a":"text"},{$or :[{"b":"text"},{"c":"text"}]}]})
This mongo console query give correct result.
How I apply this with JAVA mongo driver.
Please help
Thanks in advance
You can use following query
DBCollection userCollection = db.getCollection("collection");
BasicDBObject orQuery = new BasicDBObject();
List<BasicDBObject> obj1 = new ArrayList<BasicDBObject>();
obj1.add(new BasicDBObject("a", "text"));
obj1.add(new BasicDBObject("b", "text"));
orQuery.put("$or", obj1);
BasicDBObject andQuery = new BasicDBObject();
List<BasicDBObject> obj = new ArrayList<BasicDBObject>();
obj.add(new BasicDBObject("c", "text"));
obj.add(orQuery);
andQuery.put("$and", obj);
System.out.println(andQuery.toString());
DBCursor cursor = userCollection.find(andQuery);
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
I am new to mongodb java api. I am trying to perform queries to my database. I ve read the database found the collections in it and I want to retrieve characteristics of users. My code:
ServerAddress serverAdr;
serverAdr = new ServerAddress(".. .. .., ...);
Twitter twitter = null;
MongoOptions options = new MongoOptions();
options.connectionsPerHost = 10;
MongoClient mongoClient = new MongoClient(.. ... ...", ...);
DB db = mongoClient.getDB("trendSetters");
System.out.println("Connect to database successfully");
//JSONObject content = getJSONFromFile("user.json");
Mongo mongo = null;
Set<String> colls = db.getCollectionNames();
mongo = new Mongo(serverAdr, options);
mongo.setWriteConcern(WriteConcern.SAFE);
DB db_se = mongo.getDB("iti_se");
DBCollection incollection = db_se.getCollection("cms_users_unique");
DBCollection outcollection = db_se.getCollection("cms_users_features");
for (String s : colls) {
System.out.println(s);
}
Now I want to perform queries to retrieve from all ids the usernames for example. How is it possible to do so in java mongodb API?
EDIT: What i ve tried
BasicDBObject query = new BasicDBObject();
DBCursor cursor;
query = new BasicDBObject("followers", new BasicDBObject("$gt", 1));
cursor = incollection.find(query);
while(cursor.hasNext()){
System.out.println(cursor.next());
}
However, it doesnot return nothing.
You asked: "I want to perform queries to retrieve from all ids the usernames for example."
To retrieve all documents from collection you can use find() method of the DBCollection.
DBCursor cursor;
cursor = incollection.find();
After that, you can get the field value by its name for each document as below
while(cursor.hasNext()){
System.out.println(cursor.next().get("username"));
}
If you need to add more criterias to query documents:
BasicDBObject query1;
DBCursor cursor;
query1 = new BasicDBObject("age", new BasicDBObject("$gt", 25));
cursor = incollection.find(query1);
while(cursor.hasNext()){
System.out.println(cursor.next().get("username"));
}
DBCollections objects have method find which takes mainly a DBObject argument. For instance, if you want to find users with age > 50 this can help you.
query = new BasicDBObject("age", new BasicDBObject("$gt", 50));
cursor = incollection.find(query);
while(cursor.hasNext()){
System.out.println(cursor.next());
}
BasicDBObject take first argument, that is a field, and second argument that is another BasicDBObject or a value. With composition of these objects you can build any query.
I recommend you take a look at MongoDB Documentation, it's pretty good.
Mongo Java Driver http://docs.mongodb.org/ecosystem/drivers/java/
See Javadoc. http://api.mongodb.org/java/current/
I have to write a simple MongoDB query using java but am not able to do it.
The mongo query looks like this:
db.yourCollection.find({"$where" : "this.startDate < this.endDate"})
I have to write the above query using the QueryBuilder class. But am not able to do it in MongoDB java driver.
BasicDBObject document = new BasicDBObject();
document.put("id", 1001);
document.put("intValue", 1200);
document.put("updateValue", 2100);
DBObject query = QueryBuilder.start("intValue").lessThan("updateValue").get();
DBCursor cursor = collection.find(query);
while (cursor.hasNext()) {
System.out.println("Result : -"+cursor.next());}
The above code does not return any results. But if changed to updateValue into 2100 it is giving result. My question here is lessThan takes object as input parameter. Then how can I pass document field as an input parameter?
Ideally your mongoDB query should be like this: -
db.yourCollection.find({"startDate": {$lt: endDate}})
which can be written in Java like this: -
BasicDBObject query = new BasicDBObject("startDate", new BasicDBObject("$lt", endDate);
DBCursor cursor = coll.find(query);
You can take a look at Official Tutorial
If you want to use QueryBuilder, you can do it like this: -
DBObject query = QueryBuilder.start("startDate").lessThan("endDate").get();
DBCursor cursor = coll.find(query);
QueryBuilder helps construct complex queries to retrieve data from a collection in mongo db.
You can use the QueryBuilder like this.
BasicDBObject document = new BasicDBObject();
QueryBuilder qb = new QueryBuilder();
qb.or(new QueryBuilder().put("starting_date").is(null).put("ending_date").is(null).get(),
new QueryBuilder().put("starting_date").lessThanEquals("ending_date").get());
document.putAll(qb.get());
DBCursor cursor = getDbCollection().find(document)
QueryBuilder qb = new QueryBuilder(), instantiates a new QueryBuilder.
The logic build by the QueryBuilder in the example above is; (starting date = null and ending date = null) or (starting date <=ending date)
document.putAll(qb.get()) adds the logic constructed to the DBObject.