Выполнение Mongo как Query (JSON) через Java

Мне было интересно, есть ли способ выполнить mongo-подобный запрос непосредственно через Java, то есть мы даем mongoDB как запрос как String для функции в Java-драйвере для mongoDB как объекта String и возвращается объект DBCursor. Что-то вроде:

import com.mongodb.*;
import java.net.UnknownHostException;
public class ExecuteQuery {
public static void main(String args[]){
    try{
          Mongo m = new Mongo();
          DB db = m.getDB("test");
          DBCollection coll = db.getCollection("first");
          DBObject doc = new BasicDBObject();
          DBCursor cur =coll.executeQuery("db.first.find({"username":"joe"})");
       }
       catch(UnknownHostException e){
          System.out.println(e);
       }
       catch (MongoException.DuplicateKey e) {
          System.out.println("Exception Caught" + e);
       }
}
}

Примечание: executeQuery() не является встроенной функцией. Он просто используется для демонстрационных целей. Итак, есть ли функция в java api, которая преобразует json-строку в экземпляр BasicDBObject? Спасибо.

Ответы

Ответ 1

То, что вы показали здесь, не JSON, это код Javascript для встроенной оболочки MongoDB. Если вам по какой-то причине необходимо выполнить код внутри среды Java, вам придется встроить механизм Javascript (например, Rhino) и реализовать совместимый API.

В противном случае вам просто нужно преобразовать JSON в DBObject, и вы можете сделать это с помощью метода JSON.parse() или любого другого JSON- например, Jackson. Обратите внимание, что MongoDB использует расширенный набор типов данных, отсутствующих в JSON: http://www.mongodb.org/display/DOCS/Data+Types+and+Conventions

UPD: Скотт Эрнандес указал на JSON.parse.

Ответ 2

Да, есть способ, передав фильтр как строку. Пример:

BasicDBObject query = BasicDBObject.parse("{userId: {$gt: \"1\"}}");
FindIterable<Document> dumps = crapCollection.find(query);

Вы также можете использовать com.mongodb.util.JSON, но я не рекомендую его. Это менее наглядно.

DBObject dbObject = (DBObject)JSON.parse("{userId: {$gt: \"1\"}}");

Обратите внимание, что это может быть уязвимым для SQL-инъекций, потому что вы сами разбираете/создаете фильтр.

Я рекомендую использовать Jongo параметризованный запрос.

Ответ 3

Взгляните на библиотеку Jongo - это позволит вам запускать даже довольно сложные запросы с использованием синтаксиса командной строки.

Он также использует очень быстрый GSON mapper для возврата ваших собственных объектов к вам в результате запроса вместо списка BasicDBObjects.

Ответ 4

Я бы рекомендовал использовать утилиту mongo-shell-like-query (jar). Он позволяет писать запросы mongo в java (или scala) код с использованием того же синтаксиса, что и командная оболочка mongo. Чтобы быть более конкретным, вы можете писать запросы mongo в строчном формате. Он также поддерживает дополнительные функции, такие как конвейер агрегации. Посмотри на https://github.com/EqualExperts/mongo-shell-like-query