【发布时间】:2015-12-06 17:37:00
【问题描述】:
我有一个 mongo 集合,谎言如下:
{
"_id":ObjectId("55f16650e3cf2242a79656d1"),
"user_id":11,
"push":[
ISODate("2015-09-08T11:14:18.285 Z"),
ISODate("2015-09-08T11:14:18.285 Z"),
ISODate("2015-09-09T11:14:18.285 Z"),
ISODate("2015-09-10T11:14:18.285 Z"),
ISODate("2015-09-10T11:14:18.285 Z")
]
}{
"_id":ObjectId("55f15c78e3cf2242a79656c3"),
"user_id":12,
"push":[
ISODate("2015-09-06T11:14:18.285 Z"),
ISODate("2015-09-05T11:14:18.285 Z"),
ISODate("2015-09-07T11:14:18.285 Z"),
ISODate("2015-09-09T11:14:18.285 Z"),
ISODate("2015-09-09T11:14:18.285 Z"),
ISODate("2015-09-10T11:14:18.285 Z"),
ISODate("2015-09-11T11:14:18.285 Z")
]
}
如何在单个查询中找到 timeStamps (currentDate-5) 的 user_ids。我将使用 php 并且不想将所有文档都放在内存中。
解释:
user_id : date : count
11 : 2015-09-08 : 2
2015-09-09 : 1
2015-09-10 : 2
12 : 2015-09-05 : 1
2015-09-06 : 1
2015-09-07 : 1
2015-09-09 : 2
2015-09-10 : 1
2015-09-11 : 1
如果日期设置为 2015-09-09(用户输入),它将为 user_id 11 提供 3(计数),为 user_id 12 提供 4(计数)。因此假设计数设置为 3(用户输入)。查询应返回 11(user_id)。如果 count 设置为 2,将没有可用的 user_id,如果 count 设置为 5,它应该返回 11 和 12
【问题讨论】:
-
哎哟!为什么将字段命名为“推”?这几乎与您可以得到的故意造成混淆的代码一样接近。似乎是某人的“错字”。但是您真的是要查找“少于三个”的数组项的“计数”吗?
-
推送我的意思是push_notification,有很多像sms这样的字段,现在我猜它理解了,这些是发送推送时的时间戳。并且是那些大于特定日期的数组项的计数
-
我的意思是,“结果代码”通常看起来像
{ "$push": { "push": "something" } }(作为 JSON 表示),无论如何让读者感到非常困惑。清晰的字段命名将有助于代码的可读性。这里的另一点是“什么日期”?您的问题完全没有这一点,当我认为您不清楚时,为什么 我 在 cmets 中询问。请编辑告诉我们您未提及的“日期标准”。除非您的意思是文档的基本选择,或者您只想“计算”在该时间范围内“发生”的数组条目? -
我已经更新了问题,但之前我写了“过去 5 天内 numberOfTimeStamps 小于 3”所以“5 天”描述了日期标准
-
好吧。这至少说明了这一点。请理解它是/在问题中呈现的方式是/是开放的解释。因此可能导致错误的结果/响应。为什么我问。
标签: php mongodb mongodb-query aggregation-framework