java - MongoDB/Java - 如何在 java 中为 mongodb 实现 $out

标签 java mongodb aggregation-framework

我有一个aggregate()查询,其结果数据超过16Mb。为了解决 16Mb 问题,他们提供了如下内容。

{$out : "datasetTemp"}
 // datasetTemp name of collection.

我尝试在 MongoDB shell 中执行以下操作,它可以正常工作。

db.dataset.aggregate([ { $match : {isFlat : true}}, {$out : "datasetTemp"}])

但我需要使用管道使用 java-mongodb 来完成此操作。

这是原始代码的一部分

dbObjArray = new BasicDBObject[2]
dbObjArray[0]= cruxLevel
dbObjArray[1] = project
//dbObjArray[2] = out
List<DBObject> pipeline = Arrays.asList({dbObjArray})
output= dataset.aggregate(pipeline)

我尝试了这个不起作用(未创建集合)

dbObjArray = new BasicDBObject[2]
dbObjArray[0]= cruxLevel
dbObjArray[1] = project
//dbObjArray[2] = out
List<DBObject> pipeline = Arrays.asList({dbObjArray},{$out:"datasetTemp"})
output= dataset.aggregate(pipeline)

这不会引发任何不创建集合的错误。

这个我也试过了

                 DBObject out = new BasicDBObject('$out', "temp_colls");
                 dbObjArray = new BasicDBObject[2]
                 dbObjArray[0]= cruxLevel
                 dbObjArray[1] = project
                // dbObjArray[2] = out
                 List<DBObject> pipeline = Arrays.asList({dbObjArray})
                 if (!datasetObject?.isFlat && jsonFor != 'collection-grid') {
                     //mongoPipeline = new AggregateArgs (Pipeline = pipeline, AllowDiskUse = true, OutputMode = AggregateOutputMode.Cursor)
                     output= dataSetCollection.aggregate(pipeline,out)
                     DBCollection tempColl =  dataBase.getCollection("temp_colls")
                     def cursor = tempColl.find();
                     try {
                         while(cursor.hasNext()) {
                             System.out.println(cursor.next());
                         }
                     } finally {
                         cursor.close();
                     }
                     output = cursor
                 }else{
                     output= dataSetCollection.aggregate(project)
                 }                  
                 output.results().eachWithIndex{list,index->
                 dataList.add(output.results()[index])
                }                   

它抛出以下错误。

com.mongodb.CommandFailureException: { "serverUsed" : "127.0.0.1:15847" , "errmsg" : "exception: aggregation result exceeds maximum document size (16MB)" , "code" : 16389 , "ok" : 0.0}

该场景下如何使用$out

谢谢。

最佳答案

您可能想尝试一下:

public class JavaAggregation {
    public static void main(String args[]) throws UnknownHostException {

        MongoClient mongo = new MongoClient();
        DB db = mongo.getDB("databaseName");

        DBCollection coll = db.getCollection("dataset");

        /*
            MONGO SHELL : 
            db.dataset.aggregate([ 
                { "$match": { isFlat : true } }, 
                { "$out": "datasetTemp" }
            ])
        */

        DBObject match = new BasicDBObject("$match", new BasicDBObject("isFlat", true)); 
        DBObject out = new BasicDBObject("$out", "datasetTemp"); 

        AggregationOutput output = coll.aggregate(match, out);

        DBCollection tempColl = db.getCollection("datasetTemp");
        DBCursor cursor = tempColl.find();

        try {
            while(cursor.hasNext()) {
                System.out.println(cursor.next());
            }
        } finally {
            cursor.close();
        }
    }
}

关于java - MongoDB/Java - 如何在 java 中为 mongodb 实现 $out,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33146816/

相关文章:

node.js - Mongodb $addFields,从函数返回字段值?

mongodb - MongoDB聚合框架如何统计满足一定条件的组数?

mongodb - 在 mongodb 中相乘说只对字符串类型进行操作

java - 访问远程数据库是否必须在android中编写Contract、Provider和DbHelper?

java - 如何在Java中迭代某个目录的文件?

javascript - 导出的变量未定义,而函数在 Node js 中导出

mongodb - 如何在 MongoDB 聚合中使用 $lookup 作为 INNER JOIN?

java - EditText 在开始时具有永久缩进

java - 计时器是否会无限期地继续运行,直到调用其 .cancel 方法

mysql - 同一类型的多个表的数据库设计