2017-02-02 74 views
0

春天我需要寫mongodb聚合管道的幫助。如何在Spring中的日期/時間(年,月,日,小時)部分編寫Mongodb聚合組管道?

這裏是我想要執行查詢的數據示例(請注意以下數據是的匹配結果匹配彈簧中的聚合管道,它具有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": ISODate("2017-01-29T03:00:00.000Z"), 
     "eventName": "A" 
    } 

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

所以數據是一組小時,併除此之外分秒:

樣品我希望它看起來結果像哪些項目僅EVENTDATE和eventName的領域現在設置爲0。

我試過這個解決辦法,但我沒有工作: MongoTemplate aggregate - group by date

任何形式的幫助表示讚賞。提前致謝。

回答

0

您可以使用日期計算在這裏得到的日期與時間分,秒和毫秒部分重置爲0

您可能需要根據您的春天蒙戈版本和Java版本進行一些調整。

版本:3.2蒙戈,春蒙戈1.9.5版本和Java 8

蒙戈殼牌查詢:

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

Spring代碼:

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")))); 

更新:使用$項目

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); 
+0

如果您不知道但$ subtract不是有效的組運算符,那麼您的解決方案將不起作用! 對於ref:https://docs.mongodb.com/manual/reference/operator/aggregation-group/ –

+0

您是否嘗試運行代碼?它適用於3.2版本。我會找到試圖找到文件。我還會更新解決方案,將邏輯移至'$ project'。 – Veeram

+0

是的,我試着運行代碼,但它給了我一個錯誤,無效的組操作符$減法。當然,讓我知道! –

相關問題