【发布时间】:2020-09-22 19:14:33
【问题描述】:
以下是我的 mongodb 集合中的一些示例条目:
{ name: "Tom", timestamp: "Jun 4" },
{ name: "Jerry", timestamp: "Jun 4" },
{ name: "Tom", timestamp: "Jun 2" },
{ name: "Tom", timestamp: "May 25" },
{ name: "Jerry", timestamp: "May 21" },
{ name: "Robin", timestamp: "May 19" }
每次用户登录我的应用时,我都会为该用户创建一个条目。
问题:我需要找出过去 5 天未登录我的应用的用户列表。也就是说,5 月 30 日之后没有条目。今天是 6 月 4 日。
答案: 罗宾
尝试 1:
[
{ "$match": { "timestamp": { "$lt": FIVE_DAYS_AGO } } },
{ "$sort": { "timestamp": 1 } },
{ "$group": { "_name": "$name", "lastSynced": { "$last": "$timestamp" } }
]
给出不正确的结果,因为在 NOW 和 FIVE_DAYS_AGO 之间可能存在未被考虑的条目。
尝试 2:
[
{ "$sort": { "timestamp": 1 } },
{ "$group": { "_name": "$name", "lastSynced": { "$last": "$timestamp" } }
]
未优化!因为它返回所有不同的用户条目。然后我必须遍历结果并过滤掉时间戳为 FIVE_DAYS_AGO 的条目。
如何构造查询以获取过去 X 天内没有条目的用户列表?
【问题讨论】:
-
你真的有这样的数据吗 ::timestamp: "Jun 4" 表示它是一个字符串还是
timestamp的数据类型是date? -
由于您的
timestamp是字符串格式,您需要使用$dateFromString运算符,如果您查看文档,只有有限的日期字符串,可以转换。因此,我建议您将字段更新为适当的可转换值。 -
@whoami ,你说得对。它是数据类型
date的timestamp。为了解释清楚,我把它写成一个字符串。但我想我在这样做的时候把别人弄糊涂了。我的错。 -
嘿@ngShravil.py,感谢您的解决方案帮助。
标签: mongodb mongoose mongodb-query aggregation-framework pymongo