21

我想知道是否有一种方法可以直接通过 Java 执行类似 mongo 的查询,即我们将类似 mongoDB 的查询作为字符串提供给 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实例的函数?谢谢。

4

5 回答 5

12

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

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 的参数化查询

于 2016-09-15T13:04:56.173 回答
9

您在这里展示的不是 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

于 2011-02-01T11:21:17.713 回答
2

看看Jongo 库——它可以让你使用命令行语法运行非常高级的查询。

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

于 2013-03-17T15:01:05.830 回答
1

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

于 2013-07-19T14:05:03.017 回答
0

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

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

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

于 2011-02-01T18:09:42.667 回答