【问题标题】:Sort by array length in java mongodb在java mongodb中按数组长度排序
【发布时间】:2019-12-09 09:01:56
【问题描述】:

我有一个包含 4 个文档的 mongo 数据库。这些文档包含一个长度不同的数组。 我想使用 mongodb 驱动程序按它们在 java 中的数组长度对文档进行排序。 我该怎么做?

【问题讨论】:

标签: java mongodb mongodb-query


【解决方案1】:

您可以通过两种方式做到这一点:

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();
}

【讨论】:

    【解决方案2】:

    此聚合查询按数组大小对文档进行降序排序:

    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"))。我也更改了答案中的代码。
    • 我收到此消息“管道不能包含空值”
    • 我得到了正确的输出,并且没有错误(刚刚尝试过)。你能编译代码吗?
    • 这个“MYCLASS 类型的方法升序(字符串)未定义”
    猜你喜欢
    • 1970-01-01
    • 2013-01-12
    • 2020-11-08
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2012-02-20
    • 2012-07-21
    相关资源
    最近更新 更多