【发布时间】:2014-09-09 16:22:23
【问题描述】:
我有以下文件:
{
"_id" : ObjectId("540dadfcf3116b60d401c314"),
"value" : 2,
"d_c_at" : [
"2013",
"201311",
"2013w46",
"20131116"
]
}
我想按 d_c_at 数组 (20131116) 中的最后一个元素对它们进行分组,该数组将年、月和日存储为解构日期。
这是我目前所拥有的:
db.points.aggregate(
{ $match: { "d_c_at.0": '2014' } },
{ $group: { _id: "$d_c_at.0", value: { $sum: "$value" } } }
)
返回:
{ "_id" : [ ], "value" : 1207 }
我尝试过使用$unwind,但没有成功:
db.points.aggregate(
{ $match: { "d_c_at.0": '2014' } },
{ $unwind: "$d_c_at" },
{ $group: { _id: "$d_c_at", value: { $sum: "$value" } } }
)
看起来几乎不错,但它也可以在其他数组元素上分组:
{ ... }
{ "_id" : "20140519", "value" : 33 }
{ "_id" : "20140707", "value" : 36 }
{ "_id" : "20140330", "value" : 37 }
{ "_id" : "20140709", "value" : -28 }
{ "_id" : "20140620", "value" : 14 }
{ "_id" : "2014w9", "value" : -250 }
{ ... }
预期输出:
{ ... }
{ "_id" : "20140519", "value" : 33 }
{ "_id" : "20140707", "value" : 36 }
{ "_id" : "20140330", "value" : 37 }
{ "_id" : "20140709", "value" : -28 }
{ "_id" : "20140620", "value" : 14 }
{ ... }
【问题讨论】:
-
为什么要这样存储日期?您可以使用date expression operators 对日期的某些部分进行分组。
-
为什么不在展开后复制聚合中的匹配项?我不确定预期的输出应该是什么。
-
@wdberkeley 在查询特定年、周、日创建的文档时性能更好
-
@LarryBattle 按问题编辑,预期输出。基本上我想要
value组的总和。 -
@Pierre-LouisGottfrois:为了获得更好的性能,您有 a)多键索引,b)聚合中的额外展开展开阶段(延迟早期匹配),c)大量增加的数据大小,d) 字符串匹配。对不起,但再想想。使用数据表达式运算符到目前为止在所有级别上都是更好的解决方案。
标签: mongodb aggregation-framework