[英]Sort by array length in java mongodb
我有一個包含 4 個文檔的 mongo 數據庫。 這些文檔包含一個不同長度的數組。 我想使用 mongodb 驅動程序按 java 中數組的長度對文檔進行排序。 我該怎么做?
您可以通過兩種方式做到這一點:
1) 向您的文檔添加一個附加字段,該字段將包含此數組的大小。 然后按此字段對文檔進行排序。
2)使用聚合框架。 展開數組,然后對其進行分組,並另外對數組中的元素求和。 然后最后按大小排序。
public void myFunction(){
List<AggregationOperation> aggregationOperations = new ArrayList<>();
aggregationOperations.add(Aggregation.unwind("myArrayField"));
aggregationOperations.add(Aggregation.group("_id").push("myArrayField").as("myArrayField").sum("1").as("size")
.first("fieldToPreserve").as("fieldToPreserve")); //preserve fields from first document
aggregationOperations.add(Aggregation.sort(Sort.Direction.DESC,"size"));
mongoTemplate.aggregate(Aggregation.newAggregation(aggregationOperations), "MyCollection", MyCollection.class).getMappedResults();
}
此聚合查詢按數組大小對文檔進行排序,降序:
db.test.aggregate( [
{ $addFields: { arrSize: { $size: "$arr" } } },
{ $sort: { arrSize: -1 } }
] )
使用驅動程序版本 3.9.0 的Java 代碼:
Bson addFiledsStage = addFields(new Field<Document>("arrSize", new Document("$size", "$arr")));
Bson sortStage = sort(descending("arrSize"));
List<Bson> pipeline = Arrays.asList(addFiledsStage, sortStage);
List<Document> results = new ArrayList<>();
collection.aggregate(pipeline).into(results);
results.forEach(System.out::println);
上述代碼所需的導入:
import org.bson.Document;
import org.bson.conversions.Bson;
import static com.mongodb.client.model.Sorts.*;
import static com.mongodb.client.model.Aggregates.*;
import com.mongodb.client.model.Field;
import java.util.*;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.