簡體   English   中英

將Mongo查詢轉換為spring Mongooperations

[英]Convert Mongo query to spring Mongooperations

有人可以幫助我將這個原生mongo查詢轉換為spring數據嗎? 它使用setIntersection的聚合函數。

任何人都可以將該查詢轉換為Mongo for Java( org.springframework.data.mongodb.core.MongoOperations )?

db.TeachersCalendar.aggregate([
     { 
       $match : { 
          $and: [
           {"schedule.startDate": {$in:[ISODate("2020-11-15T23:30:00Z"), ISODate("2019-11-24T01:00:00Z"), ISODate("2020-07-26T23:00:00Z")]}},
           {"schedule.status": 'AVAILABLE'}
          ]
      }
     },
     { 
            $unwind: '$schedule' 
     }, 
        {
            $project: {
                _id: 1,
                status: '$schedule.status',
                startDate: '$schedule.startDate',
                week: {
                    $concat: [
                        {
                            $toString: {
                                $isoWeek: '$schedule.startDate'
                            }
                        },
                        '-',
                        {
                            $toString: {
                                $isoWeekYear: '$schedule.startDate'
                            }
                        }
                    ] 
                },
                duration: {$literal: 0.5}
            }
        },
        {
            $group: {
                _id: {
                    id: '$_id',
                    week: '$week',
                    status: '$status'
                },
                startDate: {
                    $addToSet: {
                        $cond: [
                            {
                                $eq: ['$status', 'AVAILABLE']
                            },
                            '$startDate',
                            null
                        ]
                    }
                },
                bookedDuration: {
                    $sum: '$duration'
                }
            }
        },
        {
            $project: {
                _id: 1,
                availableSlots: {
                        $setIntersection: [[ISODate("2020-11-15T23:30:00Z"), ISODate("2019-11-24T01:00:00Z"), ISODate("2020-07-26T23:00:00Z")], '$startDate'] 
                },
                bookedDuration: {
                    $cond: [{$eq: ['$_id.status', 'BOOKED']}, '$bookedDuration', 0]
                }
            }
        },
        {
          $unwind: { path: '$availableSlots', preserveNullAndEmptyArrays: true}
        },
        {
            $group: {
                _id: {
                    id: '$_id.id',
                    week: '$_id.week'
                },
                availableSlots: {$addToSet:  '$availableSlots'},
                bookedDuration: {$sum : '$bookedDuration'}
            }
        },
        {
            $match:{
                $and :[ 
                    {
                        bookedDuration: { $lt: 20 }
                    },
                    { 
                        availableSlots: {$not: {$size: 0}}
                    }
                ]
            }
        },
        {
          $unwind: '$availableSlots'
        },
        {
            $group: {
                _id: '$_id.id',
                availableSlots: {
                    $addToSet: '$availableSlots'
                }
            }
        }
])

如何處理必須與日期列表相交的spring數據的setIntersection

如果您嘗試將聚合管道轉換為Java代碼, MongoDB Compass將使用export to language選項為您執行此操作。 這是你的代碼

import java.util.Arrays;
import org.bson.Document;
import org.bson.BsonNull;
Arrays.asList(new Document("$match", 
    new Document("$and", Arrays.asList(new Document("schedule.startDate", 
                new Document("$in", Arrays.asList(new java.util.Date(1605483000000L), 
                            new java.util.Date(1574557200000L), 
                            new java.util.Date(1595804400000L)))), 
                new Document("schedule.status", "AVAILABLE")))), 
    new Document("$unwind", "$schedule"), 
    new Document("$project", 
    new Document("_id", 1L)
            .append("status", "$schedule.status")
            .append("startDate", "$schedule.startDate")
            .append("week", 
    new Document("$concat", Arrays.asList(new Document("$toString", 
                    new Document("$isoWeek", "$schedule.startDate")), "-", 
                    new Document("$toString", 
                    new Document("$isoWeekYear", "$schedule.startDate")))))
            .append("duration", 
    new Document("$literal", 0.5d))), 
    new Document("$group", 
    new Document("_id", 
    new Document("id", "$_id")
                .append("week", "$week")
                .append("status", "$status"))
            .append("startDate", 
    new Document("$addToSet", 
    new Document("$cond", Arrays.asList(new Document("$eq", Arrays.asList("$status", "AVAILABLE")), "$startDate", 
                        new BsonNull()))))
            .append("bookedDuration", 
    new Document("$sum", "$duration"))), 
    new Document("$project", 
    new Document("_id", 1L)
            .append("availableSlots", 
    new Document("$setIntersection", Arrays.asList(Arrays.asList(new java.util.Date(1605483000000L), 
                        new java.util.Date(1574557200000L), 
                        new java.util.Date(1595804400000L)), "$startDate")))
            .append("bookedDuration", 
    new Document("$cond", Arrays.asList(new Document("$eq", Arrays.asList("$_id.status", "BOOKED")), "$bookedDuration", 0L)))), 
    new Document("$unwind", 
    new Document("path", "$availableSlots")
            .append("preserveNullAndEmptyArrays", true)), 
    new Document("$group", 
    new Document("_id", 
    new Document("id", "$_id.id")
                .append("week", "$_id.week"))
            .append("availableSlots", 
    new Document("$addToSet", "$availableSlots"))
            .append("bookedDuration", 
    new Document("$sum", "$bookedDuration"))), 
    new Document("$match", 
    new Document("$and", Arrays.asList(new Document("bookedDuration", 
                new Document("$lt", 20L)), 
                new Document("availableSlots", 
                new Document("$not", 
                new Document("$size", 0L)))))), 
    new Document("$unwind", "$availableSlots"), 
    new Document("$group", 
    new Document("_id", "$_id.id")
            .append("availableSlots", 
    new Document("$addToSet", "$availableSlots"))))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM