Search code examples
javamongodbmongo-javamongo-java-driver

MongoDB - Implementing nor query in java


I have the following query which I am trying to implement in Java (I am using 3.4.2 mongo-java driver) :

Json:

     {
      "_id" : "Team:2334918",
      "fieldName" : [
                "Delivery",
                "Support"
            ],
      "isDeleted" : false
      }

Here the query:

  db.myCollection.find({$nor: [{“fieldName”: {$exists: false}},{“fieldName”:{$size:0}}]})

I have written the following code to implement the above query:

    MongoClient mc = ctm.getMongoConn();
     db = ctm.getDatabase(mc);
     col = db.getCollection(collectionName);

    BasicDBObject searchObject = new BasicDBObject();
    List<BasicDBObject> searchArguments = new ArrayList<BasicDBObject>();

    searchArguments.add(new BasicDBObject("fieldName",new BasicDBObject("$exists",false)));
    searchArguments.add(new BasicDBObject("fieldName",new BasicDBObject("$size",0)));
    searchObject.put("$nor", searchArguments);

    MongoCursor<Document> curs = (MongoCursor<Document>) col.find(searchObject);

    while (curs.hasNext()){

             Document doc = curs.next();
             Object name1 = doc.get("fieldName");

             System.out.println(name1.toString());
             j++;
         }

I am getting the following error while running:

java.lang.ClassCastException: com.mongodb.FindIterableImpl cannot be cast to com.mongodb.client.MongoCursor

Solution

  • Replace this:

    MongoCursor<Document> curs = (MongoCursor<Document>) col.find(searchObject);
    
    while (curs.hasNext()) {
    
    }
    

    With this:

    FindIterable<Document> docs = col.find(searchObject);
    
    for (Document d : docs) {
    
    }
    

    The suggestion from @Veeram (in the comments above) is correct too.