通过Java执行像Query(JSON)这样的Mongo

时间:2011-02-01 09:12:25

标签: java json mongodb mongo-java

我想知道是否有一种方法可以直接通过Java执行类似查询的mongo,即我们将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 个答案:

答案 0 :(得分:8)

你在这里展示的不是JSON,它是嵌入式MongoDB Shell的Javascript代码。如果由于某种原因需要在Java环境中执行代码,则必须嵌入Javascript引擎(如Rhino)并实现兼容的API。

否则您只需要将JSON转换为DBObject,您可以使用JSON.parse()方法或任何其他JSON映射库(如Jackson)执行此操作。请注意,MongoDB使用JSON中不存在的扩展数据类型集:http://www.mongodb.org/display/DOCS/Data+Types+and+Conventions

UPD:Scott Hernandez指出了JSON.parse

答案 1 :(得分:7)

是的,通过将过滤器作为字符串传递,有办法。例如:

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's parameterized query

答案 2 :(得分:1)

查看Jongo library - 它将允许您使用命令行语法运行甚至非常高级的查询。

它还使用非常快速的GSON映射器将您自己的对象作为查询结果返回给您,而不是基本数据库列表。

答案 3 :(得分:1)

我建议使用类似mongo-shell的查询工具(jar)。它允许您使用与mongo命令shell相同的语法在java(或scala)代码中编写mongo查询。更具体地说,您可以以字符串格式编写mongo查询。它还支持聚合管道等高级功能。 看一下 https://github.com/EqualExperts/mongo-shell-like-query

答案 4 :(得分:0)

您可以按照教程中的示例进行操作:

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

注意他们使用(Basic)DBObject来创建查询,而不是字符串。