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

时间:2018-12-11 11:21:25

标签: java mongodb morphia

我有以下查询:

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

注意:- 请不要建议query.where()

4 个答案:

答案 0 :(得分:0)

摘自文档:

您可以使用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
}

答案 1 :(得分:0)

@ Marcus-rool的第一个答案是正确的方法。您可以使用df1 = sqlContext.createDataFrame( [ ('2018-06-02T00:00:00','12:30:00 AM', '06-02-2018 00:30:00.000+0000') ,('2018-11-15T00:00:00','03:00:00 AM', '11-15-2018 03:00:00.000+0000') ,('2018-06-02T00:00:00','10:30:00 AM', '06-02-2018 10:30:00.000+0000') ,('2018-06-02T00:00:00','12:30:00 PM', '06-02-2018 12:30:00.000+0000') ,('2018-11-15T00:00:00','03:00:00 PM', '11-15-2018 15:00:00.000+0000') ,('2018-06-02T00:00:00','10:30:00 PM', '06-02-2018 22:30:00.000+0000') ] ,['dt', 'tm', 'desiredCalculatedResult'] ) ,尽管您不应该这样做。由于Java的访问历史和限制,它在公开场合露面。但应注意,该方法在1.5.0中已弃用(尚未发布),在2.0.0中将被删除/替换。它实际上是fromDBObject()公开的内部方法,但从未打算在外部使用。

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

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

赞:

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