весной mongodb отправлять только ненулевые поля - PullRequest
0 голосов
/ 07 января 2020

У меня есть класс документа Article, например.

package com.document.feed.model;

import java.util.List;

import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.lang.NonNullFields;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
class Source {
    private String id;
    private String name;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Document
@Getter
@Setter
@JsonIgnoreProperties(ignoreUnknown = true)
public class Article {

    @Id
    private String id;
    private Source source;
    private String author;
    private String title;
    private String description;
    private String url;
    private String urlToImage;
    private String publishedAt;
    private String content;
    private String country;
    private String category;

    // Vector of Tf-Idf weights.
    private List<Double> v;

    // Extra fields computed during ordering.
    private double dot;

//    public Article(String id, String author, Double dot) {
//        this.id = id;
//        this.author = author;
//        this.dot = dot;
//    }
}

Я использую конвейер агрегации, чтобы выбрать только author и dot документов как:

{
    author: 1,
    dot: 1
}

Агрегация сделано как:

Aggregation aggregation = newAggregation(Article.class,
            aggregate("$project",
                    projection),
                    sort(Sort.Direction.DESC, "dot")
);
return mongoTemplate.aggregate(aggregation, "article", Article.class);

Но я получаю ответ API как:

{
    "id": "5e137c67771a9880d1639b5d",
    "source": null,
    "author": "Asian News International",
    "title": null,
    "description": null,
    "url": null,
    "urlToImage": null,
    "publishedAt": null,
    "content": null,
    "country": null,
    "category": null,
    "v": null,
    "dot": 3.2454110250954025
},

Я хочу, чтобы в качестве выходных данных были только ненулевые поля. Я могу сделать это, определив новый класс POJO только для обязательных полей, но есть ли способ сделать это без определения новых классов (Это будет кошмар, если проекция является параметром только API)?

1 Ответ

2 голосов
/ 07 января 2020

Добавить аннотацию Джексона @JsonInclude для удаления пустых полей.

@JsonInclude(Include.NON_NULL)
...