Могу ли я использовать необработанный запрос с Morphia? - PullRequest
0 голосов
/ 11 декабря 2018

У меня следующий запрос:

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

Примечание: - Пожалуйста, не предлагайте query.where()

Ответы [ 4 ]

0 голосов
/ 08 июля 2019

В Morphia v1.3.2 для доступа к методу createQuery, который получает аргумент DBObject, необходимо преобразовать хранилище данных в AdvancedDatastore.

Как:

Query<MyClass> myQuery = ((AdvancedDatastore) myDatastore).createQuery(MyClass.class, myDbObject);
0 голосов
/ 11 декабря 2018

@ Первый ответ Маркуса-Рула - правильный подход.Вы можете использовать fromDBObject(), но не должны.Это открыто для общественности в значительной степени из-за истории и ограничений в элементах управления доступом Java.Но следует отметить, что этот метод устарел в 1.5.0 (еще не выпущен) и будет удален / заменен в 2.0.0.Это действительно внутренний метод, который был раскрыт для $reasons, но никогда не предназначался для внешнего использования.

0 голосов
/ 11 декабря 2018

Другой вариант, если у вас уже есть запрос в формате необработанной строки, - это использовать BasicDBObject.parse() для разбора вашего запроса на DBObject, а затем построить Query с использованием этого DBObject.Следует отметить, что если эта строка поступает из пользовательских данных, вам следует убедиться, что вы не выполняете произвольные запросы, которые могут получить данные, не авторизованные для пользователя, отправляющего этот запрос.

0 голосов
/ 11 декабря 2018

Из документации:

Вы можете использовать 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
}
...