我可以在 Morphia 中使用原始查询吗?

Can I use raw query with Morphia?

我有以下查询:

{ query: { "$where" : { this.userName == 'Jack123' } }  }

注意:- 请勿推荐query.where()

来自文档:

您可以使用 Morphia 将您可能已经使用原始 Java API 编写的查询映射到您的对象,或者访问 Morphia 中尚不存在的功能。

例如:

DBObject query = BasicDBObjectBuilder.start()
    .add("albums",
            new BasicDBObject("$elemMatch",
                    new BasicDBObject("$and", new BasicDBObject[] {
                        new BasicDBObject("albumId", albumDto.getAlbumId()),
                        new BasicDBObject("album",
                            new BasicDBObject("$exists", false))})))
    .get();

Artist result = datastore.createQuery(Artist.class, query).get();

希望对您有所帮助。

更新:

或者你可以试试这个:

DBCursor dbCursor = datastore.getCollection(MyClass.class).find(query);
while (dbCursor.hasNext()) {
    DBObject obj = dbCursor.next();
    MyClass class = morphia.fromDBObject(datastore, MyClass.class, obj);
    // do stuff
}

@Marcus-roool 的第一个答案是正确的方法。你 可以 使用 fromDBObject() 尽管你不应该。由于 Java 的访问控制的历史和限制,它被公开了。但需要注意的是,该方法在 1.5.0 中已弃用(尚未发布),在 2.0.0 中将 removed/replaced。它实际上是一种为 $reasons 公开的内部方法,但从未打算在外部使用。

如果您已经有了原始字符串格式的查询,另一种选择是使用 BasicDBObject.parse() 将您的查询解析为 DBObject,然后使用 DBObject 构建 Query =].应该注意的是,如果这个字符串来自用户数据,你应该注意确保你没有执行任意查询,这些查询可能会获取未经授权的用户提交该查询的数据。

在 Morphia v1.3.2 中,要访问接收 DBObject 参数的 createQuery 方法,您必须将数据存储转换为 AdvancedDatastore。

赞:

Query<MyClass> myQuery = ((AdvancedDatastore) myDatastore).createQuery(MyClass.class, myDbObject);