我有一个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/