繁体   English   中英

在java mongodb中按数组长度排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM