【发布时间】:2017-10-26 19:43:19
【问题描述】:
我有一个 MongoDB 集合,division_entry。
我希望按标签过滤,然后按时间和独特的不同值进行存储。 最后,我想要在给定时间跨度内所有不同的唯一值。
目前,我必须在代码中存储并按时间跨度进行调用。这会导致调用过多。 现在 -
db.division_entry.aggregate([{ $match : { $and : [ { "division.label" : “ABCD”},{“时间戳”:{$gt:1495448249635,$lt:1495448249641}} ] } } , {$group : { _id : "$unique"} } , {$count : "value" }])
非常感谢您对实际结果的帮助。
编辑: 更多详情:
{
"_id" : "1",
"timestamp" : NumberLong("1495448249640"),
"unique" : "One",
"division" : [
{
"label" : "ABCD"
}
]
}
{
"_id" : "3",
"timestamp" : NumberLong("1495448249636"),
"unique" : "Two",
"division" : [
{
"label" : "ABCD"
}
]
}
{
"_id" : "2",
"timestamp" : NumberLong("1495448249650"),
"unique" : "Two",
"division" : [
{
"label" : "ABCD"
}
]
}
db.division_entry.aggregate([{ $match : { $and : [ { "division.label": "ABCD"}, { "timestamp" : { $gt: 1495448249635, $lt: 1495448249651 }} ] } } , {$group : { _id : "$unique"} }])
{ "_id" : "Two" }
{ "_id" : "One" }
db.division_entry.aggregate([{ $match : { $and : [ { "division.label" : "ABCD"}, { "timestamp" : { $gt: 1495448249635, $lt: 1495448249651 } } ] } } , {$group : { _id : "$unique"} } , {$count : "value" }])
{ "value" : 2 }
这是在匹配查询中指定的特定时间范围内完成的。假设我想要一天数据的一分钟粒度,我将不得不进行 1440 次这样的调用,其中每次调用的时间戳范围将涵盖一分钟。
我需要帮助来同时为“唯一”字段存储和查找不同的值。
【问题讨论】:
-
这里的实际分组是什么?您是否也应该看到不同的
"timestamp"或者只是“时间戳桶”中不同的"unique"值?从你的问题和这么小的样本中很难说出来。有几种技术可以解决此问题,但您包含的聚合管道示例无效也无济于事。如果您可以编辑以澄清这些观点,最好是预期的输出,那么它将有助于您的问题。 -
如果您可以指定您的“存储桶”是非常简单的东西,例如“定期间隔”(即 1 分钟、1 小时等),那么这也会让事情变得更加清晰。您包含的查询时间戳仅相隔 6 毫秒,这可能并不能真正表明您正在尝试做什么。
-
好多了。所以间隔总是均匀的?我的意思是例如分组中所有文档之间的 1 分钟?当然可以选择更改该间隔,但需要在分组结果之间保持一致的间隔。
-
@NeilLunn 是的,边界是固定的,比如 1 分钟
标签: mongodb mongodb-query aggregation-framework