MongoDB shell query on timestamp range not working in java - java

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

Related

How to improve the query performance of MongoDB in java

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.

Queries in java mongodb API

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/

Find ancestors in mongodb with Java

In the mongo shell I retrieve ancestors of an element (I built a tree structure with an array of ancestors) using this query:
db.collection.findOne({_id: "some_unique_id"}).ancestors
What is the equivalent code in Java?
My code that doesn't get the right result is:
BasicDBObject root = new BasicDBObject();
root.put("_id", idObj);
root.put("type", typeObj);
BasicDBObject query = new BasicDBObject("ancestors", root);
DBObject o = locations.findOne(query);
System.out.println(idObj + " - findone => " + o.toString());
Where is the error?
Thanks in advance
The Java equivalent to your mongo shell query is:
BasicDBObject query = new BasicDBObject("_id", "some_unique_id");
DBObject o = locations.findOne(query);
System.out.println(o.get("ancestors"));

How to do this MongoDB query using java?

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.

Query Syntax in mongodb for sql "like" - i am using java

basically this is my question:
How to query MongoDB with "like"?
but i guess all the answers in here are applicable when you are using mongodb shell command line, so what is the equivalent for db.users.find({"name": /.*m.*/}) when we are using java.
here is how i am trying to do
DBCollection coll = MongoDBUtil.getDB().getCollection("post_details");
BasicDBObject query = new BasicDBObject();
query.put("price", new BasicDBObject("$gt", 5).append("$lt", 8));
/*what should i write instead of this line*/
query.put("title", "/.*m.*/");
DBCursor cur = coll.find(query);
For this issue you should use a regex as in this example:
BasicDBObject query = new BasicDBObject();
Pattern regex = Pattern.compile("the title you are looking for"); // should be m in your case
query.put("title", regex);
Taking the above example as reference, but using the Filters class:
Pattern regex = Pattern.compile("title you look for");
Bson filter = Filters.eq("nombre", regex));

Categories