簡體   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