我需要生成月度和年度报告。那么如何获取具有“createdat”字段的按年和按月文档呢?
发布于 2016-04-28 16:14:57
我建议您使用将所有createdAt
字段投影到year
和month
字段所需的aggregation framework
,如下所示:
db.collection.aggregate([{
$project: {
year: {
$year: "$createdat"
},
month: {
$month: "$createdat"
},
log_field: 1,
other_field: 1,
}
}, {
$match: {
"year": 2016
}
}]);
有关$project
的更多详细信息
发布于 2016-04-28 18:13:07
我知道你可能无法改变你的数据结构,但如果你改变了,这可能会对你有用……
我在我们的项目中做了相当多这样的事情,并且总是发现最好的(就像在,最简单和最快的)方法是预先单独存储这种信息。
因此,作为示例,我存储了完整的datetime字段(就像您一样),但也将YYYYMM值以及Day存储在它自己的字段中。根据数据类型的不同,这些值/格式可能会有所不同,但我在这方面已经取得了很好的成功。
(作为背景,我正在存储财务计算数据,每个客户每个月在任何地方存储多达几百万条记录.不是聚合框架很好地管理的东西)
BSON的一个小样本
....
"cd" : ISODate("2016-02-29T22:59:59.999Z"),
"cdym" : "201602",
"cdd" : "29",
....
发布于 2016-05-03 17:05:09
我得到了答案,这就是答案。
db.mycollection.aggregate([
{ "$redact": {
"$cond": [
{ "$and": [
{ "$eq": [ { "$year": "$date" }, 2016 ] },
{ "$eq": [ { "$month": "$date" }, 5 ] }
] },
"$$KEEP",
"$$PRUNE"
] }
}
])
https://stackoverflow.com/questions/36907056
复制相似问题