Выполнение 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 для создания запроса, а не строку.