簡體   English   中英

Mongodb使用多個日期范圍獲取記錄並按這些日期分組

[英]Mongodb fetch records using multiple date ranges and group by these dates

我的數據庫中有與此類似的數據

 {
            _id: ObjectId(<some mongo default encoded id>),
        user: 45,
event_group: 1,
            events: [
            {event: "event name", current_points:1, date: ISO(2017-05-11 21:00:45.774Z)},
            {event: "event name1", current_points:2, date: ISO(2017-05-11 22:15:45.774Z)},
            {event: "event name2", current_points:5, date: ISO(2017-05-11 22:10:55.774Z)},
            {event: "event name3", current_points:8, date: ISO(2017-05-12 23:00:45.774Z)},
            {event: "event name4", current_points:10, date: ISO(2017-05-12 21:00:45.774Z)},
            {event: "event name5", current_points:25, date: ISO(2017-05-14 22:15:45.774Z)},
            {event: "event name6", current_points:20, date: ISO(2017-05-14 22:10:55.774Z)},
            ]
          }

{
            _id: ObjectId(<some mongo default encoded id>),
        user: 45,
event_group: 2,
            events: [
            {event: "event name", current_points:10, date: ISO(2017-05-11 21:00:45.774Z)},
            {event: "event name1", current_points:15, date: ISO(2017-05-11 22:15:45.774Z)},
            {event: "event name2", current_points:12, date: ISO(2017-05-11 22:10:55.774Z)},
            {event: "event name3", current_points:18, date: ISO(2017-05-12 23:00:45.774Z)},
            {event: "event name4", current_points:25, date: ISO(2017-05-12 21:00:45.774Z)},
            {event: "event name5", current_points:50, date: ISO(2017-05-14 22:15:45.774Z)},
            {event: "event name6", current_points:100, date: ISO(2017-05-14 22:10:55.774Z)},
            ]
          }

{
            _id: ObjectId(<some mongo default encoded id>),
        user: 44,
event_group: 1,
            events: [
            {event: "event name", current_points:20, date: ISO(2017-05-11 21:00:45.774Z)},
            {event: "event name1", current_points:15, date: ISO(2017-05-11 22:15:45.774Z)},
            {event: "event name2", current_points:30, date: ISO(2017-05-11 22:10:55.774Z)},
            {event: "event name3", current_points:35, date: ISO(2017-05-12 23:00:45.774Z)},
            {event: "event name4", current_points:45, date: ISO(2017-05-12 21:00:45.774Z)},
            {event: "event name5", current_points:100, date: ISO(2017-05-14 22:15:45.774Z)},
            {event: "event name6", current_points:120, date: ISO(2017-05-14 22:10:55.774Z)},
            ]
          }

我想在7、15、30或更多天的間隔內獲取記錄。 我需要獲取所有日期(每天)的用戶記錄。 目前,我正在使用以下查詢來獲取它們:

db.Collection.aggregate(
{"$match":{"user":181}},{"$unwind":"$events"},{"$match":{"events.date":{"$gte":{"sec":1523471400,"usec":0},"$lte":{"sec":1523557799,"usec":0}}}},{"$sort":{"events.date":1}},{"$group":{"_id":null,,"points":{"$last":"$events.current_points"}}});

它獲取1個日期范圍內的記錄,我將此查詢運行7、15、30次或更多次。 查詢和數據運行良好,但在服務器上增加了更多處理。 我想將此查詢合並為1個單個查詢,類似這樣。 以下是查詢以獲取7天的記錄。

感謝您解決我的查詢Vince Bowdren中的錯誤。 這是我更新的查詢。

如何通過我從中獲取數據的日期對結果進行分組。 例如,如果日期在2017-05-23 00:00:00和2017-05-23 23:59:59之間,則結果也應通過該日期進行分組。

我需要獲取所有這些數據,以便通過日期將它們繪制在圖形中。

db.getCollection('Collection').aggregate(
{"$match":{"user":121}},
{"$unwind":"$events"},
{"$match":{"$or":[
    {"events.date":{"$gte":{"sec":1522780200,"usec":0},"$lte":{"sec":1522866599,"usec":0}}},
    {"events.date":{"$gte":{"sec":1522866600,"usec":0},"$lte":{"sec":1522952999,"usec":0}}},
    {"events.date":{"$gte":{"sec":1522953000,"usec":0},"$lte":{"sec":1523039399,"usec":0}}},
    {"events.date":{"$gte":{"sec":1523039400,"usec":0},"$lte":{"sec":1523125799,"usec":0}}},
    {"events.date":{"$gte":{"sec":1523125800,"usec":0},"$lte":{"sec":1523212199,"usec":0}}},
    {"events.date":{"$gte":{"sec":1523212200,"usec":0},"$lte":{"sec":1523298599,"usec":0}}},
    {"events.date":{"$gte":{"sec":1523298600,"usec":0},"$lte":{"sec":1523384999,"usec":0}}},
    {"events.date":{"$gte":{"sec":1523385000,"usec":0},"$lte":{"sec":1523471399,"usec":0}}},
    {"events.date":{"$gte":{"sec":1523471400,"usec":0},"$lte":{"sec":1523557799,"usec":0}}},
    {"events.date":{"$gte":{"sec":1523557800,"usec":0},"$lte":{"sec":1523644199,"usec":0}}},
    {"events.date":{"$gte":{"sec":1523644200,"usec":0},"$lte":{"sec":1523730599,"usec":0}}},
    {"events.date":{"$gte":{"sec":1523730600,"usec":0},"$lte":{"sec":1523816999,"usec":0}}},
    {"events.date":{"$gte":{"sec":1523817000,"usec":0},"$lte":{"sec":1523903399,"usec":0}}},
    {"events.date":{"$gte":{"sec":1523903400,"usec":0},"$lte":{"sec":1523989799,"usec":0}}},
    {"events.date":{"$gte":{"sec":1523989800,"usec":0},"$lte":{"sec":1524076199,"usec":0}}}
    ]}},
{"$sort":{"events.date":1}},
{"$group":{"_id":"$user","events":{"$push":"$events"},
    "points":{"$last":"$events.current_points"},   
    }
}
) 

目前,我得到以下結果:

{
    "result": [{
        "_id": 121,
        "points": 42930,
        "events": [{
            "current_points": 41875,
            "won": 1,
            "date": {
                "sec": 1522780225,
                "usec": 237000
            },
            "event_name": "abc"
        }, {
            "current_points": 41875,
            "won": 1,
            "date": {
                "sec": 1522780225,
                "usec": 237000
            },
            "event_name": "absc"
        }, {
            "current_points": 41875,
            "won": 0,
            "date": {
                "sec": 1522780225,
                "usec": 237000
            },
            "event_name": "abcd"
        }]
    }]
}

那不是您應該如何在$match塊中編寫條件。 編輯查詢,使其看起來像這樣:

{"$or":[
    {"sec":{"$gte":1523471400}},{"usec":{"$gte":0}},{"sec":{"$lte":1523557799}},{"usec":{"$lte":0}}
    ....... //other criteria to be added.
    ]
}

也不要重復對usec標准檢查。 只需添加剩余的sec匹配條件即可。

您錯誤地使用了$或條件

代替這個:

{"$match":{"events.date":
  {"$or":[
    {"$gte":{"sec":1523471400,"usec":0},"$lte":{"sec":1523557799,"usec":0}},
    {"$gte":{"sec":1523557800,"usec":0},"$lte":{"sec":1523644199,"usec":0}},
    {"$gte":{"sec":1523644200,"usec":0},"$lte":{"sec":1523730599,"usec":0}},
    {"$gte":{"sec":1523730600,"usec":0},"$lte":{"sec":1523816999,"usec":0}},
    {"$gte":{"sec":1523817000,"usec":0},"$lte":{"sec":1523903399,"usec":0}},
    {"$gte":{"sec":1523903400,"usec":0},"$lte":{"sec":1523989799,"usec":0}},
    {"$gte":{"sec":1523989800,"usec":0},"$lte":{"sec":1524076199,"usec":0}}
    ]
  }
}},

$ or需要一組獨立的查詢, 每個查詢都包含他們正在查詢的字段 嘗試將其更改為此:

{"$match":{
  "$or":[
    {"events.date" : {"$gte":{"sec":1523471400,"usec":0},"$lte":{"sec":1523557799,"usec":0}}},
    {"events.date" : {"$gte":{"sec":1523557800,"usec":0},"$lte":{"sec":1523644199,"usec":0}}},
    {"events.date" : {"$gte":{"sec":1523644200,"usec":0},"$lte":{"sec":1523730599,"usec":0}}},
    {"events.date" : {"$gte":{"sec":1523730600,"usec":0},"$lte":{"sec":1523816999,"usec":0}}},
    {"events.date" : {"$gte":{"sec":1523817000,"usec":0},"$lte":{"sec":1523903399,"usec":0}}},
    {"events.date" : {"$gte":{"sec":1523903400,"usec":0},"$lte":{"sec":1523989799,"usec":0}}},
    {"events.date" : {"$gte":{"sec":1523989800,"usec":0},"$lte":{"sec":1524076199,"usec":0}}
    ]
  }
},

暫無
暫無

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

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