Выполнение Mongo как Query (JSON) через Java - PullRequest
18 голосов
/ 01 февраля 2011

Мне было интересно, есть ли способ выполнить запрос, подобный монго, непосредственно через Java, т. Е. Мы передаем запрос, подобный mongoDB, в виде строки для функции в драйвере 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 экземпляр? Спасибо.

Ответы [ 5 ]

9 голосов
/ 15 сентября 2016

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

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 .

8 голосов
/ 01 февраля 2011

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

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

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

1 голос
/ 19 июля 2013

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

1 голос
/ 17 марта 2013

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

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

0 голосов
/ 01 февраля 2011

Вы можете следовать примеру в учебнике:

http://www.mongodb.org/display/DOCS/Java+Tutorial#JavaTutorial-GettingASetofDocumentsWithaQuery

Обратите внимание, что для создания запроса используется (Basic) DBObject, а не строка.

...