如何仅使用mongo-java-driver执行MongoDB本机查询(JSON)?

时间:2017-11-03 10:30:13

标签: json mongodb native mongo-java-driver

如何仅使用java-mongo-driver触发mongo本机查询。

  

Spring-Data或EclipseLink或Hibernate OGM,仅使用 java-mongo-driver

示例查询:

db.orders.aggregate([
   {
      $unwind: "$specs"
   },
   {
      $lookup:
         {
            from: "inventory",
            localField: "specs",
            foreignField: "size",
            as: "inventory_docs"
        }
   },
   {
      $match: { "inventory_docs": { $ne: [] } }
   }
])

4 个答案:

答案 0 :(得分:1)

如果你的问题是:

  

我可以将上面的字符串传递给Java驱动程序并让驱动程序执行它吗?

然后你可以使用db.eval命令。例如:

MongoDatabase database = mongoClient.getDatabase("...");

Bson command = new Document("eval", "db.orders.aggregate([\n" +
        "   {\n" +
        "      $unwind: \"$specs\"\n" +
        "   },\n" +
        "   {\n" +
        "      $lookup:\n" +
        "         {\n" +
        "            from: \"inventory\",\n" +
        "            localField: \"specs\",\n" +
        "            foreignField: \"size\",\n" +
        "            as: \"inventory_docs\"\n" +
        "        }\n" +
        "   },\n" +
        "   {\n" +
        "      $match: { \"inventory_docs\": { $ne: [] } }\n" +
        "   }\n" +
        "])");
Document result = database.runCommand(command);

... db.eval命令已弃用,其使用情况为is not advised。 MongoDB Java驱动程序可用于执行聚合,但不能用于“字符串形式”,而是使用Java驱动程序的聚合帮助程序来创建聚合命令的Java形式。有关此in the docs的详细信息。

这是一个使用3.x MongoDB Java驱动程序的(未经测试的)示例...

MongoCollection<Document> collection = mongoClient.getDatabase("...").getCollection("...");

AggregateIterable<Document> documents = collection.aggregate(Arrays.asList(
        // the unwind stage
        new Document("$unwind", "$specs"),

        // the lookup stage
        new Document("$lookup", new Document("from", "inventory")
                .append("localField", "specs")
                .append("foreignField", "size")
                .append("as", "inventory_docs")),

        // the match stage
        new Document("$match", new Document("inventory_docs", new BasicDBObject("$ne", new String[0])))
));

..这可能会帮助您查看从shell脚本到Java的转换形式。

答案 1 :(得分:1)

我的时间已经不多了,因此使用了以下解决方法。 稍后将详细探讨莫尔科斯的建议。 但是下面的代码也可以。

import com.infrasoft.mongo.MongoClientFactory;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.CommandResult;
import com.mongodb.DB;
import com.mongodb.DBObject;
import com.mongodb.util.JSON;

/**
 *
 * @author charudatta.joshi
 */
public class TestNaiveQuery1 {

    public static void main(String[] args) {

        String nativeQuery = "db.orders.aggregate([\n"
                + "   {\n"
                + "      $unwind: \"$specs\"\n"
                + "   },\n"
                + "   {\n"
                + "      $lookup:\n"
                + "         {\n"
                + "            from: \"inventory\",\n"
                + "            localField: \"specs\",\n"
                + "            foreignField: \"size\",\n"
                + "            as: \"inventory_docs\"\n"
                + "        }\n"
                + "   },\n"
                + "   {\n"
                + "      $match: { \"inventory_docs\": { $ne: [] } }\n"
                + "   }\n"
                + "])";

        DBObject command = new BasicDBObject();
        DB db = MongoClientFactory.getMongoClientFactory().getMongoClient().getDB("frms_data_demo");

        nativeQuery = "function() { return (" + nativeQuery + ").toArray(); }";

        //command.put("eval", "function() { return db." + collectionName + ".find(); }");
        command.put("eval", nativeQuery);
        CommandResult result = db.command(command);

        BasicDBList dbObjList = (BasicDBList) result.toMap().get("retval");

        DBObject dbo0 = (BasicDBObject) dbObjList.get(0);
        DBObject dbo1 = (BasicDBObject) dbObjList.get(0);

        System.out.println(dbObjList.get(0));
        System.out.println(dbObjList.get(1));
        // .... just loop on dbObjList

    }


}

答案 2 :(得分:0)

此查询从3.0版开始不推荐使用。 https://docs.mongodb.com/manual/reference/method/db.eval/,我使用了mongodb4.0集群,不支持eval功能,

答案 3 :(得分:0)

@ aaronwang4love 您可以尝试以下代码。 未经测试。现在无法访问环境。如果可以,请进行更新。

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\"}}");