#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.