当前位置: 首页 > 面试题库 >

MongoDB Java驱动程序3.x:如何将allowDiskUse = true传递给aggregate()方法?

鄂昌胤
2023-03-14
问题内容

我正在使用 mongo-java-driver 3.0.2

我有一种MongoCollection.aggregate(List<Bson> pipeline)用于排序和限制的方法:

private static MongoIterable<Document> selectTop(int n) {
    BasicDBObject sortFields = new BasicDBObject("score", -1);
    BasicDBObject sort = new BasicDBObject("$sort", sortFields);

    BasicDBObject limit = new BasicDBObject("$limit", n);

    List<BasicDBObject> pipeline = new ArrayList<>();
    pipeline.add(sort);
    pipeline.add(limit);

    return playersCollection.aggregate(pipeline);
}

n大时,出现:

com.mongodb.MongoCommandException: Command failed with error 16820: 'exception: Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting. Aborting operation. Pass allowDiskUse:true to opt in.'

我发现 MongoDB Shell 提供了一个方法db.collection.aggregate(pipeline, options)(link),其中options可以包含一个allowDiskUse字段。

我在 Java API中
找不到与此等效的东西。尽管有一个AggregationOptions类,但MongoCollection该类没有提供aggregate(List<Bson> pipeline, AggregationOptions options)方法。


问题答案:

这仍然适用于3.0.3驱动程序:

    MongoClient client = new MongoClient(new ServerAddress("127.0.0.1", 27017));

    DB test = client.getDB("test");

    DBCollection sample = test.getCollection("sample");

    List<DBObject> aggregationQuery = Arrays.<DBObject>asList(
            new BasicDBObject("$sort",new BasicDBObject("score",-1)),
            new BasicDBObject("$limit",1)
    );

    System.out.println(aggregationQuery);

    Cursor aggregateOutput = sample.aggregate(
            aggregationQuery,
            AggregationOptions.builder()
                    .allowDiskUse(true)
                    .build()
    );

    while ( aggregateOutput.hasNext() ) {
        DBObject doc = aggregateOutput.next();
        System.out.println(doc);
    }

当然,您也可以使用更新的类:

    MongoClient client = new MongoClient(new ServerAddress("192.168.2.4", 27017));

    MongoDatabase db = client.getDatabase("test");

    MongoCollection<Document> collection = db.getCollection("sample");

    AggregateIterable<Document> result = collection.aggregate(Arrays.asList(
            new BasicDBObject("$sort", new BasicDBObject("score", -1)),
            new BasicDBObject("$limit", 1)
    )).allowDiskUse(true);

    MongoCursor<Document> cursor = result.iterator();

    while (cursor.hasNext()) {
        Document doc = cursor.next();
        System.out.println(doc);
    }

因此,.aggregate()在MongoCollection上返回一个AggregateIterable类实例,该实例具有一个.allowDiskuse()方法以及其他设置聚合选项的方法。



 类似资料:
  • 问题内容: 我正在尝试禁用Chrome控制台的输出。如果我通过–start-maximized选项,则可以正常工作。我可能输入了错误的命令? 我也试过 输出量 已启动的ChromeDriver端口= 26703版本= 23.0.1240.0日志= / Brett / workspace / TestNG / chromedriver.log [1214/161331:ERROR:ipc_sync_

  • 问题内容: 我正在尝试禁用Chrome控制台的输出。如果我通过–start-maximized选项,则可以正常工作。我可能输入了错误的命令? 我也试过 输出量 已启动的ChromeDriver端口= 26703版本= 23.0.1240.0 log = / Brett / workspace / TestNG / chromedriver.log [1214/161331:ERROR:ipc_sy

  • 本文向大家介绍如何使用Python将选项传递给Selenium Chrome驱动程序?,包括了如何使用Python将选项传递给Selenium Chrome驱动程序?的使用技巧和注意事项,需要的朋友参考一下 我们可以使用Python将选项传递给Selenium Chrome驱动程序。这可以借助ChromeOptions和DesiredCapabilities类的帮助。对于ChromeOptions

  • 这是我的第一个Java应用程序。我正在尝试创建一个产品(键)和它们的价格(值)的地图。文档上说我不能用doubles换钱,所以我得用bigdecimal。我现在完全不知道如何在我的方法和地图中使用BigDecimal。 寄存器类: 主类:

  • 当我运行pyspark program interactive shell时,可以获取pyspark脚本中的配置文件(config.ini),但当我试图使用Spark submit命令和主纱运行相同的脚本时,并且集群部署模式是集群,因为配置文件不存在,所以它给了我错误,我检查了纱日志,可以看到相同的,下面是运行pyspark作业的命令。

  • 问题内容: 我试图将我的数据库对象传递给我的处理程序,而不是具有全局对象。但是我不知道这是否可行,我使用的是Gorilla Mux软件包,我可以看到它把闭包作为第二个参数。 然后定义了我可以使用的参数,理想情况下,我希望拥有这样的第三个参数。 有解决方法吗?还是我需要一个全局数据库对象?我是Go的新手,所以请详细说明可能的答案。 问题答案: 欢迎来到。 可以使用全局变量,特别是数据库对象。 但是,