gpt4 book ai didi

mongodb - 有没有一种有效的方法可以根据特定时区按天对记录进行分组?

转载 作者:可可西里 更新时间:2023-11-01 10:44:20 26 4
gpt4 key购买 nike

我正在使用 MongoDB 数据库来跟踪应用程序的分析。我正在编写一个 Clojure 应用程序(使用 clj-time 和 Monger)以从数据库中获取数据。

我有一个包含像这样的记录的集合

{"_id": ObjectId(...),
timestamp: ISODate("2013-06-01T15:18:37Z"),
device: "04dbf04b6dc0d0a4fd383967b3dc62f50111e07e"}

每个不同的设备代表我服务的不同用户。我想做的是找出我每天有多少(唯一)用户,但需要注意的是我希望“天”专门指代美国/中部时区,考虑到夏令时. (如果这不是必需的,我想我可以做一些类似 $group 然后 distinct 的事情。)

这是我一直在做的事情:

(ns analytics.reporting
(:use [monger.core :only [connect! connect set-db! get-db]]
monger.operators
clj-time.core
clj-time.periodic
clj-time.format)
(:require [monger.collection :as mc]))

(defn to-central
[dt]
(from-time-zone dt (time-zone-for-id "America/Chicago")))

(defn count-distinct
[coll]
(count (distinct coll)))

(defn daily-usage
[ndays]
(let [midnights (map to-central
(reverse (for [offset (map days (range ndays))]
(minus (to-central (today-at 0 0)) offset))))
by-day (for [midnight midnights]
(mc/find-maps "devices" {:timestamp {$gte midnight $lt (plus midnight (days 1))}}))
devices-by-day (map #(map :device %) by-day)
distinct-devices-by-day (map count-distinct devices-by-day)]
distinct-devices-by-day))

如果您看不懂 Clojure,这基本上是说:获取中部时区最近 n 个午夜的列表,然后运行 ​​Mongo 查询以查找每个时间之间的所有记录连续的一对午夜。然后,计算每天不同设备的数量。

以下是我不喜欢这种方法的地方:

  1. 每天运行一个单独的查询(我通常一次查看 30 天)感觉不对;这是应该在数据库端而不是应用程序端完成的事情。
  2. 计算不同的设备也应该由数据库完成。
  3. 我的服务器设置为 UTC 时区,因此如果在 UTC 午夜之后但在中部时间午夜之前,此列表中的最后一个条目将始终为零。这很容易修补,但我更喜欢一个足够聪明的解决方案来首先防止它。
  4. 整个函数运行大约需要 500 毫秒。这并不可怕——我是唯一一个运行查询的人,而且每天只运行一次或两次——但看起来这个操作不应该花那么长时间。

有什么方法可以将更多这种逻辑插入 MongoDB 查询中?

最佳答案

正如@WiredPrairie 所建议的那样,我最终在将每条记录添加到数据库时只包含了中部时间日期。然后我可以使用简单的 $group 查询来收集每个日期的记录数。

关于mongodb - 有没有一种有效的方法可以根据特定时区按天对记录进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16876120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com