Я хотел бы сделать текстовый поиск в моей базе данных, используя Mongodb
и Spring Boot
, а затем сгруппировать их по элементу document
, на который есть ссылка, но мой код не работает, и я не знаю, что неправильно это. Вот мой основной документ:
@Document(collection = "mainCollection")
public class mainCollection{
@Id
private String id;
@TextIndexed(weight=7)
private String myText7;
@TextIndexed(weight=3)
private String myText3;
private SecondDocument secondDoc;
}
Вот второй документ:
@Document(collection = "secondCollection")
public class SecondDocument{
private String doc_name;
@Id
private String id;
}
Вот мой код для поиска текстовой строки:
TextCriteria criteria = TextCriteria.forDefaultLanguage().matchingAny(searchStr);
MatchOperation match = Aggregation.match(criteria);
GroupOperation group = Aggregation.group("secondDoc.doc_name").push("myText7").as("myText7").push("myText3").as("myText3");
UnwindOperation unwindt7 = Aggregation.unwind("myText7");
UnwindOperation unwindt3 = Aggregation.unwind("myText3");
Aggregation aggregation = Aggregation.newAggregation(match, unwindt7, unwindt3,group);
AggregationResults<AggrResults> results = mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(mainCollection.class), AggrResults.class);
List<AggrResults> result= results.getMappedResults();
Вот мой пример данных:
{ "_id" : ObjectId("5eacfd602aeec51754eca0a3"),
"myText7" : "test", "myText3" : "",
"secondDoc" : { "_id" : ObjectId("5eacfd602aeec51754eca0a2"), "doc_name" : "Lasdehner Straße"}
}
{ "_id" : ObjectId("5eacfda52aeec52a6036c2a2"),
" myText7" : "test",
" myText3" : "",
“secondDoc " : { "_id" : ObjectId("5eacfda52aeec52a6036c2a1"), "doc_name" : "Lakhnau"}
}
{ "_id" : ObjectId("5eacff552aeec536f4a880a7"),
"myText7" : "test",
"myText3" :””,
"secondDoc " : { "_id" : ObjectId("5eacff552aeec536f4a880a6"), "doc_name" : "Lasdehner Straße" }
}
{ "_id" : ObjectId("5ead07202aeec54778f91dcc"),
" myText7" : "test",
"myText3" : "test2",
"secondDoc" : { "_id" : ObjectId("5ead07202aeec54778f91dcb"), "doc_name" : "Negaunee"}
}
Итак, когда я ищу «test», я ожидаю, что получит эти три группы (и получит весь документ, включая внутренний документ как результат):
Группа 1:
{ "_id" : ObjectId("5eacfda52aeec52a6036c2a2"),
"myText7" : "test",
"myText3" : "",
“secondDoc " : { "_id" : ObjectId("5eacfda52aeec52a6036c2a1"), "doc_name" : "Lakhnau"}
}
Группа 2:
{ "_id" : ObjectId("5eacfd602aeec51754eca0a3"),
"myText7" : "test", "myText3" : "",
"secondDoc" : { "_id" : ObjectId("5eacfd602aeec51754eca0a2"), "doc_name" : "Lasdehner Straße"}
}
{ "_id" : ObjectId("5eacff552aeec536f4a880a7"),
"myText7" : "test",
"myText3" :””,
"secondDoc " : { "_id" : ObjectId("5eacff552aeec536f4a880a6"), "doc_name" : "Lasdehner Straße" }
}
Группа 3:
{ "_id" : ObjectId("5ead07202aeec54778f91dcc"),
"myText7" : "test",
"myText3" : "test2",
"secondDoc" : { "_id" : ObjectId("5ead07202aeec54778f91dcb"), "doc_name" : "Negaunee"}
}
Что я получаю как результат - 3 группы, и это правильно. Но форматирование неверно. Вторая группа выглядит следующим образом:
"myText7" : [ "test" , "test"],
"myText3" : [ "" , ""],
Я хотел бы получить результат этой группы в виде двух отдельных документов.