【发布时间】:2019-12-09 09:01:56
【问题描述】:
我有一个包含 4 个文档的 mongo 数据库。这些文档包含一个长度不同的数组。 我想使用 mongodb 驱动程序按它们在 java 中的数组长度对文档进行排序。 我该怎么做?
【问题讨论】:
标签: java mongodb mongodb-query
我有一个包含 4 个文档的 mongo 数据库。这些文档包含一个长度不同的数组。 我想使用 mongodb 驱动程序按它们在 java 中的数组长度对文档进行排序。 我该怎么做?
【问题讨论】:
标签: java mongodb mongodb-query
您可以通过两种方式做到这一点:
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);
上述代码所需的imports:
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.*;
【讨论】:
sort(ascending("arrSize")) 更改为sort(descending("arrSize"))。我也更改了答案中的代码。