mongodb - 如何在 mongodb 中按键过滤,按日期范围查找,然后按周聚合?

标签 mongodb mongodb-query aggregation-framework

我有一个名为 MyCollection 的 mongo 集合,它由如下所示的文档组成:

{ 
    "_id" : ObjectId("58085384e4b0f70605461e3f"), 
    "uid" : "fa1aeafc-18db-41a5-8ee5-ac0c32428fe1",
    "Key1" : "Value1"  
    "timeStamp" : ISODate("2016-08-23T17:58:20.000+0000"), 
}

某些文档具有 Key1,而其他文档则具有 Key2Key3

现在,我希望执行以下操作:-

  1. 仅获取具有 Key1Key2 的文档。
  2. 从上面生成的文档集中,仅获取 timeStamp 范围 Date(2016, 08, 01)Date(2016) 内的文档, 08, 31).
  3. 对于上面生成的一组文档,请按周进行汇总。

如何为此编写 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/

相关文章:

java - 如何在一个 Spring Boot 应用程序中使用多个 mongodb 数据库并在单个 yml 文件中进行配置

mongodb - 如何使用来自 MongoDB 的过滤记录构建 Spark 数据框?

javascript - MongoDB 填充聚合管道分页中的缺失日期

arrays - 在 item._id 为空的数组中查找项目

javascript - 从值数组中计算不同的 MongoDb

mongodb findOne 与解释

Play 框架中通过 SSL 的 MongoDB 连接

node.js - MongoError : Invalid Operation, 没有批量操作

mongodb - 在 MongoDB 中按条件分组

java - Spring Data MongoDB - 使用嵌套字段投影进行聚合