Java Morphia中的复杂查询

Java Morphia中的复杂查询,java,mongodb,morphia,Java,Mongodb,Morphia,在我的Java方法中, 我想将一个复杂的查询作为参数传递给我的集合MongoDB,如下所示: {"$or": [{"$and": [{"contextID": "AKKA"}, {"messageID": "PIPPO"}]}, {"$and": [{"domain": "Niguarda"}, {"hostName": {"$ne": "hostServer"}}]} ] } 包含查询的字符串是可变的,并在查询字符串中作为参数传递 我试图将查询作为参数传递给

在我的Java方法中, 我想将一个复杂的查询作为参数传递给我的集合MongoDB,如下所示:

{"$or": [{"$and": [{"contextID": "AKKA"}, {"messageID": "PIPPO"}]},
         {"$and": [{"domain": "Niguarda"}, {"hostName": {"$ne": "hostServer"}}]}
        ]
}
包含查询的字符串是可变的,并在查询字符串中作为参数传递

我试图将查询作为参数传递给方法条件

(queryDB.criteria("
    {"$or": [
        {"$and": [{"contextID": "AKKA"}, {"messageID": "PIPPO"}]},
        {"$and": [{"domain": "Niguarda"}, {"hostName": {"$ne": "hostServer"}}]}]
    }"
) 
但它不起作用


有什么建议吗?

你想做的是

Query q = dao.createQuery();
q.or(
 q.and(new Criteria[]{ dao.createQuery().filter("contextID").equal("AKKA"),
                       dao.createQuery().filter("messageID").equal("PIPPO") }),
 q.and(new Criteria[]{ dao.createQuery().filter("domain").equal("Niguarda"),
                       dao.createQuery().filter("hostname").notEqual("hostServer") })
);
这是现在的代码(它工作正常,但我放弃了morphia):


对于morphia还有另一种方法可以做到这一点吗?

你能澄清一下“它不起作用”是什么意思吗。它会出错吗?如果是,错误是什么。它不会产生你期望的结果吗?如果不是,区别是什么。结果与我使用空queryImportant得到的结果相同:criteria参数由变量字符串传递。这对我来说是不可能的。查询是动态的,即通过参数传递给代码。您能否编辑该问题以反映您最后的评论?执行筛选器(dynamicParam).equal(dynamicParam2)等操作有什么问题?查询的结构是可变的。。。。查询可以是简单查询,也可以是复合复杂查询(使用$or、$and、$gte等…),您知道其他方法吗?可能通过使用以下代码:String s=“{$query:{\”$和\“:[{\“ipAddress\”:\“10.100.203.120\”},{\“contexID\”:“AKKA\”}]}”;DBObject dbObjQuery=(DBObject)JSON.parse;strOut=strOut.append(dbCollection.find(dbObjQuery.count());我认为你不能用Morphia创建一个动态查询,除非你做一些反射之类的事情。但是,如果您显示了要查询的对象的Java类,它可能会帮助我们找到解决方案。您不需要删除morphia,也可以通过morphia直接访问驱动程序。
public long count(String query) throws Exception {
    DB db = mongoClient.getDB(mongoDBName);
    DBCollection dbCollection = db.getCollection(mongoDBCollection);

    DBObject dbObjQuery;

    long l = 0;
    try {

        if (!(query == null)) {
            dbObjQuery = (DBObject) JSON.parse(query);
            l = dbCollection.find(dbObjQuery).count();
        } else {
            l = dbCollection.find().count();
        }


    } catch (Exception e) {

    } finally {

    }

    return l;

}