簡體   English   中英

如何在春季的日期/時間(年,月,日,小時)的一部分上編寫Mongodb聚合組管道?

[英]How to write Mongodb aggregation group pipeline on part of Date/Time(Year, month, day, hour) in Spring?

我需要在春季編寫mongodb聚合管道方面的幫助。

這是我要在其上執行查詢的數據的示例(請注意,以下數據是Spring的Match聚合管道的結果,其條件是eventDate匹配范圍,並且eventName等於'A'):

    {
        "_id": ObjectId("1234567890"),
        "eventDate": ISODate("2017-01-29T03:56:04.297Z"),
        "eventName": "A"
    }

    {
        "_id": ObjectId("1234567890"),
        "eventDate": ISODate("2017-01-29T03:57:04.887Z"),
        "eventName": "A"
    }

    {
        "_id": ObjectId("1234567890"),
        "eventDate": ISODate("2017-01-29T04:05:00.497Z"),
        "eventName": "A"
    }

現在,我想在eventDate字段上編寫“ 組”聚合管道,該應該在“ 年” ,“ 月” ,“ 日”和“ 小時”分組 ,因為我要查找的是每小時數據。

我希望結果示例看起來像哪個項目只有eventDate和eventName字段:

    {
        "eventDate": ISODate("2017-01-29T03:00:00.000Z"),
        "eventName": "A"
    }

    {
        "eventDate": ISODate("2017-01-29T04:00:00.000Z"),
        "eventName": "A"
    }

因此,如果您在上面注意到數據是一組小時,並且此分鍾和秒現在設置為0。

我嘗試了此解決方案,但對我不起作用: MongoTemplate匯總-按日期分組

任何幫助表示贊賞。 提前致謝。

您可以在此處使用日期算術來獲取日期時間,並將分鍾,秒和毫秒部分重置為0。

您可能需要根據您的spring mongo版本和java版本進行一些調整。

版本:Mongo 3.2,Spring Mongo 1.9.5發行版和Java 8

Mongo Shell查詢:

db.collection.aggregate(
    [{
        $group: {
            _id: {
                $subtract: ["$eventDate", {
                    $add: [{
                        $multiply: [{
                            $minute: "$eventDate"
                        }, 60000]
                    }, {
                        $multiply: [{
                            $second: "$eventDate"
                        }, 1000]
                    }, {
                        $millisecond: "$eventDate"
                    }]
                }]
            },
            eventName: {
                $addToSet: "$eventName"
            }
        }
    }]
)

春季代碼:

AggregationOperation group = context -> context.getMappedObject(new BasicDBObject(
    "$group", new BasicDBObject(
    "_id",
    new BasicDBObject(
        "$subtract",
        new Object[]{
            "$eventDate",
            new BasicDBObject("$add",
                new Object[]{
                    new BasicDBObject("$multiply", 
                        new Object[]{new BasicDBObject("$minute", "$eventDate"), 60000}),
                    new BasicDBObject("$multiply", 
                        new Object[]{new BasicDBObject("$second", "$eventDate"), 1000}),
                    new BasicDBObject("$millisecond", "$eventDate")
                }
            )
        }
    )
).append("eventName", new BasicDBObject("$addToSet", "$eventName"))));

更新:使用$ project

db.collection.aggregate(
    [{
        $project: {
            eventDate: {
                $subtract: ["$eventDate", {
                    $add: [{
                        $multiply: [{
                            $minute: "$eventDate"
                        }, 60000]
                    }, {
                        $multiply: [{
                            $second: "$eventDate"
                        }, 1000]
                    }, {
                        $millisecond: "$eventDate"
                    }]
                }]
            },
            eventName: 1
        }
    }, {
        $group: {
            _id: "$eventDate",
            eventName: {
                $addToSet: "$eventName"
            }
        }
    }]
)

彈簧碼

AggregationOperation project = context -> context.getMappedObject(new BasicDBObject(
"$project", new BasicDBObject(
"eventDate",
new BasicDBObject(
    "$subtract",
    new Object[]{
        "$eventDate",
        new BasicDBObject("$add",
            new Object[]{
                new BasicDBObject("$multiply", 
                    new Object[]{new BasicDBObject("$minute", "$eventDate"), 60000}),
                new BasicDBObject("$multiply", 
                    new Object[]{new BasicDBObject("$second", "$eventDate"), 1000}),
                new BasicDBObject("$millisecond", "$eventDate")
            }
        )
    }
)
).append("eventName", 1)));

AggregationOperation group = Aggregation.group("eventDate").addToSet("eventName").as("eventName");

Aggregation agg = Aggregation.newAggregation(project, group);

暫無
暫無

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

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