Агрегация Spring Mongodb не работает с DBRef

#spring #mongodb #spring-boot #aggregation #dbref

#spring #mongodb #spring-boot #агрегация #dbref

Вопрос:

У меня есть агрегация, которая не работает в mongodb и spring boot . Я был бы признателен, если бы кто-нибудь мог мне помочь. Вот мой ExplainDoc класс:

 @Document(collection = "ExplainDoc")
public class ExplainDoc{

    @Id
    private String id;

    @TextIndexed(weight=3)
    private String product_in_brief;
    private Product product;
    
    @TextScore
    private Float textScore; }
 

И вот мой другой класс:

  @Document(collection = "product")
public class Product{   
    
    @Id 
    private String id;
    private String category;
}
 

Что я хочу сделать, так это выполнить текстовый поиск и найти все ExplainDoc файлы, в которых есть указанный текст, ПРИ product_in_brief УСЛОВИИ, ЧТО их продукт имеет определенную категорию.
В моем поисковом репозитории у меня есть агрегация, подобная следующей:

 public List<MyAggrResults> searchBriefExplanations(String text, String category){
            
MatchOperation matchRegion = Aggregation.match(Criteria.where("product.category").is(category));
TextCriteria criteria = TextCriteria.forDefaultLanguage().matchingAny(text);
MatchOperation match = Aggregation.match(criteria);
GroupOperation group =   Aggregation.group("product.category").push("$ROOT").as("myresults").sum("textScore").as("score");
ProjectionOperation project = Aggregation.project("product_in_brief", "product").andExpression("{$meta: "textScore"}").as("textScore");
}
 

Теперь код работает. Тем не менее, я вижу, что это так дорого product — всегда иметь объект в виде вложенного документа. Как я должен изменить код, если я хочу использовать product объект как @DBRef ? Когда я добавляю @DBRef , код больше не работает. Я думаю, причина в том, что product.category он больше не распознается.

Я надеюсь, что кто-нибудь сможет мне помочь.

Ответ №1:

В DBRef нет ничего особенного, что волшебным образом делало бы его эффективным. Это просто метка для комбинации имени коллекции и идентификатора. Вам все равно нужно использовать конвейер агрегации для запроса данных, использующих DBRef, так же, как вы бы запрашивали, если бы не использовали DBRef.