【问题标题】:Spring Boot & MongoDB: Getting similar field values to a arraySpring Boot 和 MongoDB:将相似的字段值获取到数组
【发布时间】:2021-07-21 04:41:36
【问题描述】:

我正在尝试将特定字段的所有值放入数组中。

这是文档结构:

 {

    "title": "testone",
    "docs": [
    {
        "fileId": "123",
        "fileName": "helloworld.txt"
    }, 
    {
        "fileId": "124",
        "fileName": "thisisalongtext.docx",
    }],
 }

目前我已经实现了以下

文档类:

public class Docs implements Serializable {

    private String fileId;

    public String getFileId() {
        return fileId;
    }

    public void setFileId(String fileId) {
        this.fileId = fileId;
    }
}

作业类:

@Document(collection = "assignemnt")
public class Assignment{

    private String title;
    private List<Docs> docs;

    public String getTitle() {
        return title;
    }


    public List<Docs> getDocs() {
        return docs;
    }

    public void setDocs(List<Docs> docs) {
        this.docs= docs;
    }

    @Override
    public String toString() {
        return "Assignment [title=" + title
            + ", docs=" + docs+ "]";
    }
}

存储库实现:

public List<Assignment> getAssignments(final String uID) {
    Query query = Query.query(Criteria.where(CREATEDBY).is(uID)
        .orOperator(Criteria.where("docs.0").exists(true),
            (Criteria.where("versionchecked").is(true))));
    return mongoTemplate.find(query, Assignment.class);
}

当前方法返回以下响应:

 {
            "title": "assignemnt123",
            "docs": [
                {
                    "fileId": "132"
                },
                {
                    "fileId": "123"
                },
                {
                    "fileId": "213"
                }
            ]       
        }

我要创建的响应:

   {
                "title": "assignemnt123",
                "docs": [ "132" , "123", "213" ]       
   }

有没有办法实现这种预期的响应?

【问题讨论】:

  • 您需要进行聚合,或者您需要以编程方式进行...
  • 我需要它以编程方式。我厌倦了聚合,但它以相同的格式返回,因为它没有正确编程。

标签: arrays spring mongodb spring-boot


【解决方案1】:

创建一个您需要所需输出的类。您已经有以下课程

@Data
@AllArgsConstructor
@NoArgsConstructor
class Docs {
  private String fileId;
  private String fileName;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Assignment {
  private String title;
  private List<Docs> docs;
}

另外创建以下类

@Data
@AllArgsConstructor
@NoArgsConstructor
class ConverterAssignment {
  private String title;
  private List<String> docs;
}

然后你就可以轻松映射了。

List<Assignment> assignmentList =
        Arrays.asList(
            new Assignment(
                "testone",
                Arrays.asList(
                    new Docs("123", "helloworld1.txt"), new Docs("345", "helloworld2.txt"))),
            new Assignment(
                "testtwo",
                Arrays.asList(
                    new Docs("456", "helloworld3.txt"), new Docs("678", "helloworld4.txt"))));

这是您从存储库获得的数据。结果,您可以轻松使用stream()。我已经测试过并且工作正常。

List<ConverterAssignment> collect =
        assignmentList.stream()
            .map(
                m ->
                    new ConverterAssignment(
                        m.getTitle(),
                        m.getDocs().stream().map(d -> d.getFileId()).collect(Collectors.toList())))
            .collect(Collectors.toList());

如果您想使用聚合

db.collection.aggregate([
  {
    $project: {
      title: 1,
      docs: "$docs.fileId",
      _id: "$$REMOVE"
    }
  }
])

工作Mongo playground

@Autowired
private MongoTemplate mongoTemplate;

public List<ConverterAssignment> test(String value) {

    Aggregation aggregation = Aggregation.newAggregation(
            Aggregation.project("title").and("docs.fileId").as("docs")
    ).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());

    return mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(Assignment.class), ConverterAssignment.class).getMappedResults();

}

注意:java 聚合代码未经测试,但它是基于工作 mongo playground 编写的

【讨论】:

    猜你喜欢
    • 2018-07-10
    • 2020-01-21
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 2018-02-07
    • 1970-01-01
    相关资源
    最近更新 更多