Мне нужна помощь в 2 вещах.
- Создание Spring Mongoquery из запроса монго с использованием шаблона Spring Mongo .
Отфильтруйте результат и получите только объекты более низкого уровня из документа, который имеет древовидную структуру json.
Я только хочу получить список подходящих merchant_shops , передав
community_id, список package_type_id и category_id.
Я использую Mongodb версии 4.
Заранее спасибо.
Документ: * * тысяча двадцать один
{
"_id" : ObjectId("5bdafff206ba681e30895e50"),
"community_id" : "09a5c059-33b3-4e47-9905-709f5c244580",
"package_types" : [
{
"package_type_id" : 1,
"categories" : [
{
"category_id" : "5bd0433d8ac2ce275082ff1f",
"subcategories" : [
{
"subcategory_id" : "5bd0436d8ac2ce275082ff20",
"merchant_shops" : [
{
"shop_id" : "5bd19a704ab492427d7326a0",
"distance" : 14.2841995007249
},
{
"shop_id" : "5bd84aed4ab4926fb2060e76",
"distance" : 14.283313487973
},
{
"shop_id" : "5bdc14ad4ab492123f29c6a7",
"distance" : 14.2829648551977
},
{
"shop_id" : "5be9555e4ab4923a01c7b7f8",
"distance" : 11.8215058435006
},
{
"shop_id" : "5be95a974ab4923a01c7b7fc",
"distance" : 11.8081739265758
}
]
}
]
}
]
},
{
"package_type_id" : 3,
"categories" : [
{
"category_id" : "5bd0433d8ac2ce275082ff1f",
"subcategories" : [
{
"subcategory_id" : "5bd0436d8ac2ce275082ff20",
"merchant_shops" : [
{
"shop_id" : "5bd84aed4ab4926fb2060e76",
"distance" : 14.283313487973
}
]
}
]
}
]
}
]
}
Запрос, который отлично работает в mongodb:
db.getCollection('community_shop').aggregate([
{ $match: {"community_id": "09a5c059-33b3-4e47-9905-709f5c244580"} },
{ $project:
{
package_types:
{$filter: {
input: '$package_types',
as: 'item',
cond: {
$or: [
{
$in: ['$$item.package_type_id', [1,3]]
},{
$eq: ['$$item.categories.category_id', "5bd0433d8ac2ce275082ff1f"]
}
]
}
}}
}
}
])
Java-класс:
@Document(collection = "community_shop")
public class CommunityShopDOB {
@Id
private String id;
@Field("community_id")
private String communityId;
@Field("package_types")
private List<PackageType> packageTypes;
public static class PackageType {
@Field("package_type_id")
private Integer packageTypeId;
@Field("categories")
private List<Category> categories;
public static class Category {
@Field("category_id")
private String categoryId;
@Field("subcategories")
private List<Subcategory> subcategories;
public static class Subcategory {
@Field("subcategory_id")
private String subcategoryId;
@Field("merchant_shops")
private List<MerchantShop> merchantShops;
public static class MerchantShop {
@Field("shop_id")
private String shopId;
@Field("distance")
private Double distance;
@Field("filter_value_ids")
private List<String> filterValueIds;
}
}
}
}
Мое решение пока и неверно:
Criteria cr = Criteria.where("communityId").is(society_id);
MatchOperation filterStates = Aggregation.match(cr);
Aggregation aggregation = newAggregation(filterStates, project("packageTypes")
.and(filter("packageTypes").as("item").by(valueOf("item.packageTypeId").equalToValue(1))
).as("packageTypes"));
AggregationResults<CommunityShopDOB> output = mongoTemplate.aggregate(aggregation, CommunityShopDOB.class,
CommunityShopDOB.class);
return output.getUniqueMappedResult();