Преобразование скрипта mongoDB в Spring-boot - PullRequest
1 голос
/ 19 апреля 2020

Я использую mongoDb с пружинной загрузкой. Я реализовал отношения один ко многим. Я храню видео в одной коллекции и сохраняю _id в категории , которая является встроенным объектом в коллекции reel .

Коллекция барабанов

{
    _id:"reelId",
    category:[
        {
            _id:"catId_1",
            videos:[
                {
                    _id:"video_1",
                    student: 40
                },
                {
                    _id:"video_2",
                    student: 30
                }
            ]
        },
        // second catgeory object
    ]
}

Видео коллекция

{
    _id"video_1",
    title:"first",
    description:"des 1",
    isGlobal: true
},
{
    _id"video_2",
    title:"second",
    description:"des 2",
    isGlobal: false
}

Ожидаемый результат.

{
    _id:"reelId",
    category:[
        {
            _id:"catId_1",
            videos:[
                {
                    _id:"video_1",
                    title:"first",
                    description:"des 1",
                    isGlobal: true
                    student: 40
                },
                {
                    _id:"video_2",
                    title:"second",
                    description:"des 2",
                    isGlobal: false
                    student: 30
                }
            ]
        },
        // second catgeory object
    ]
}

Я написал скрипт mon go, который работает отлично, как я ожидал.

db.getCollection('reel').aggregate([
{ $unwind:{path:"$category"} },
{ $unwind:{path:"$category.videos"} },
{ $lookup :{ from:"video", localField:"category.videos._id", foreignField:"_id", as:"data"} },
{ $unwind:{path:"$data", preserveNullAndEmptyArrays: true } },
{ $addFields: { "category.videos.title":"$data.title","category.videos.description":"$data.description" }},
{ $group: { _id:{_id:"$_id", category:"$category._id"}, videos:{$push:"$category.videos"} } },
{ $group: { _id:"$_id._id", category:{ $push: { _id:"$_id.category", videos: "$videos"} } } }
])

Но так как я новичок в mon go, я не мог понять как сопоставить этот скрипт с java. Я пытался во многих отношениях, но не повезло. Заранее спасибо

1 Ответ

3 голосов
/ 19 апреля 2020

Я думаю, вы можете попробовать это

Вставить этот импорт.

import org.springframework.data.mongodb.core.aggregation.*;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.unwind;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.group;

И это метод

public Object findAllwithVideos() {

        LookupOperation lookupVideos = LookupOperation
                .newLookup().from("video").localField("category.videos._id").foreignField("_id").as("data");
        Aggregation aggregation = Aggregation.newAggregation(
                unwind("category"),
                unwind("category.videos"),
                lookupVideos,
                unwind("data", true),
                new AggregationOperation() {
                    @Override
                    public Document toDocument(AggregationOperationContext aggregationOperationContext) {
                        return new Document("$addFields",
                                new Document("category.videos.title", "$data.title")
                                        .append("category.videos.description", "$data.description")
                        );
                    }
                },
                group(
                        Fields.from(
                                Fields.field("_id", "$_id"),
                                Fields.field("category", "$category._id")
                        )
                ).addToSet("$category.videos").as("videos"),
                group("_id._id")
                        .addToSet(new BasicDBObject("_id", "$_id.category")
                                .append("videos", "$videos")).as("category")


        ).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());
        return mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(Reel.class), Object.class);
    }
...