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

мне было интересно, есть ли способ выполнить Mongo like query непосредственно через Java, т. е. мы даем mongoDB like query как строку функции в драйвере Java для mongoDB в качестве строкового объекта и возвращается объект 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 ответов


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

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

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


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

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-инъекций, потому что вы сами разбираете/строите фильтр.

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


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

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


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


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

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

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