[英]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.