我有一个名为 MyCollection
的 mongo 集合,它由如下所示的文档组成:
{
"_id" : ObjectId("58085384e4b0f70605461e3f"),
"uid" : "fa1aeafc-18db-41a5-8ee5-ac0c32428fe1",
"Key1" : "Value1"
"timeStamp" : ISODate("2016-08-23T17:58:20.000+0000"),
}
某些文档具有 Key1
,而其他文档则具有 Key2
或 Key3
。
现在,我希望执行以下操作:-
- 仅获取具有
Key1
或Key2
的文档。 - 从上面生成的文档集中,仅获取
timeStamp
范围Date(2016, 08, 01)
到Date(2016) 内的文档, 08, 31)
. - 对于上面生成的一组文档,请按周进行汇总。
如何为此编写 mongo 查询?
最佳答案
使用聚合框架,上述步骤可以通过$match
来完成。 和 $group
管道步骤如下:
var start = new Date(2016, 7, 1), // months are zero-based indexes i.e Aug month index is 7
end = new Date(2016, 7, 30); // August month ends on the 30th
db.collection.aggregate([
{ /* filter steps 1 & 2 */
"$match": {
"$or": [
{ "Key1": { "$exists": true } },
{ "Key2": { "$exists": true } }
],
"timeStamp": { "$gte": start, "$lte": end }
}
},
{ /* group by week */
"$group": {
"_id": { "$week": "$timeStamp" },
"count": { "$sum": 1 },
"uids": { "$push": "$uid" }
}
}
])
在上面,日期范围是使用 Date()
创建的。 构造函数,其中月份是从零开始的索引。 $exists
运算符用于确定 key 是否存在,并使用 $week
日期聚合运算符,用于获取 0(一年中第一个星期日之前的部分周)和 53(闰年)之间的日期中的周数。
对于从 1 开始且包含当年第一个星期四的周(周一到周日)的周数,MongoDB 3.4 及更高版本提供了 $isoweek
使用运算符。
关于mongodb - 如何在 mongodb 中按键过滤,按日期范围查找,然后按周聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42777490/