Ram
Ram

Reputation: 1497

How to combine $in and max in MongoDb?

I want to get max timestamp of a set of tags from MongoDb history database. Say the tag ids are 1,2,3,4,5 I want to check all records for these tags and get the timestamp of latest. My collection looks like this along with data:

enter image description here

My code is as follows:

protected Timestamp getMaxRealTimeHistoryTimestamp(List<Integer> tagIds)
{
    try
    {
        MongoClient mongo = new MongoClient(m_connectionInfo.getHost(), m_connectionInfo.getPort());
        //Connecting to the database
        MongoDatabase database = mongo.getDatabase(m_connectionInfo.getDatabaseName());

        BasicDBObject andQuery = new BasicDBObject();
        List<BasicDBObject> obj = new ArrayList<>();
        obj.add(new BasicDBObject("TAG_ID", new BasicDBObject("$in", tagIds)));


        MongoCollection<Document> collection = database.getCollection("EM_HISTORY");
        Document doc = collection.find(andQuery).sort(new Document("TIME_STAMP", -1)).first();

        if(doc != null)
        {
            return new Timestamp(((Date) doc.get("TIME_STAMP")).getTime());
        }
    }
    catch (Exception e)
    {
        if (Logger.isErrorEnabled())
            Logger.error(e);
    }

    return null;
}

the doc variable has some strange row that is not even in the collection

enter image description here

What am I doing wrong here?

Upvotes: 1

Views: 64

Answers (1)

Thilo
Thilo

Reputation: 262584

BasicDBObject andQuery = new BasicDBObject();
List<BasicDBObject> obj = new ArrayList<>();
obj.add(new BasicDBObject("TAG_ID", new BasicDBObject("$in", tagIds)));

You are never adding the query filters from obj back into your andQuery, so the code ends up querying the collection without any filter.

Upvotes: 1

Related Questions