MongoDB - 在 java 中实现 nor 查询

MongoDB - Implementing nor query in java

我试图在 Java 中实现以下查询(我使用的是 3.4.2 mongo-java 驱动程序):

Json:

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

此处查询:

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

我写了下面的代码来实现上面的查询:

    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++;
         }

我在 运行 时收到以下错误:

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

替换为:

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

while (curs.hasNext()) {

}

有了这个:

FindIterable<Document> docs = col.find(searchObject);

for (Document d : docs) {

}

@Veeram 的建议(在上面的评论中)也是正确的。

尝试

MongoCursor<Document> curs = col.find(searchObject).iterator(); 获取光标。

您不必抓住光标。您可以使用 FindIterable 中提供的方法为您迭代游标。示例在最后。

你也在混合 Document (3.x) 和 BasicDBObject (2.x)。您可以将搜索构建器替换为

Filters searchObject = Filters.nor(Filters.exists("fieldName"), Filters.size("fieldName", 0);
FindIterable<Document> curs =  col.find(searchObject);
curs.forEach();

作者提供的更多信息