Выполнение 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
Ответ 5
Вы можете следовать примеру в учебнике:
http://www.mongodb.org/display/DOCS/Java+Tutorial#JavaTutorial-GettingASetofDocumentsWithaQuery
Обратите внимание на их использование a (Basic) DBObject для создания запроса, а не строки.